r - 比较两个矩阵 R 之间的信息

标签 r matrix

我有两个矩阵,一个是通过删除一些行从另一个矩阵中生成的。例如:

m = matrix(1:18, 6, 3)
m1 = m[c(-1, -3, -6),]

假设我不知道 m 中的哪些行被删除以创建 m1,我应该如何通过比较两个矩阵来找出它?我想要的结果是这样的:
1, 3, 6

我正在处理的实际矩阵非常大。我想知道是否有任何有效的方法来进行它。

最佳答案

以下是一些方法:

1) 如果我们可以假设 m 中没有重复的行——问题中的示例就是这种情况——那么:

which(tail(!duplicated(rbind(m1, m)), nrow(m)))
## [1] 1 3 6

2) 转置 mm1 给出 tmtm1,因为处理列比处理行更有效。

定义 match_indexes(i) ,它返回一个向量 r 使得 m[r, ] 中的每一行都匹配 m1[i, ]

将其应用于 1:n1 中的每个 i 并从 1:n 中删除结果。
n <- nrow(m); n1 <- nrow(m1)
tm <- t(m); tm1 <- t(m1)

match_indexes <- function(i) which(colSums(tm1[, i] == tm) == n1)
setdiff(1:n, unlist(lapply(1:n1, match_indexes)))
## [1] 1 3 6

3) 为每个矩阵计算一个交互向量,然后使用 setdiff 和最后 match 得到索引:
i <- interaction(as.data.frame(m))
i1 <- interaction(as.data.frame(m1))
match(setdiff(i, i1), i)
## [1] 1 3 6

添加 如果 m 中可以有重复项,那么 (1) 和 (3) 将只返回 m 中任何乘法出现的行中的第一个,而不是 m1
m <- matrix(1:18, 6, 3)
m1 <- m[c(2, 4, 5),]
m <- rbind(m, m[1:2, ])
# 1
which(tail(!duplicated(rbind(m1, m)), nrow(m)))
## 1 3 6

# 2
n <- nrow(m); n1 <- nrow(m1)
tm <- t(m); tm1 <- t(m1)
match_indexes <- function(i) which(colSums(tm1[, i] == tm) == n1)
setdiff(1:n, unlist(lapply(1:n1, match_indexes)))
## 1 3 6 7

# 3
i <- interaction(as.data.frame(m))
i1 <- interaction(as.data.frame(m1))
match(setdiff(i, i1), i)
## 1 3 6

关于r - 比较两个矩阵 R 之间的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44402561/

相关文章:

r - 如何优雅地关闭 Rserve?

python - 矩阵分配到位?

matrix - 行优先和列优先顺序真的是编程语言的属性吗

r - R中箱线图的标签中值

python - numpy 矩阵,通过对每一行进行排序将 0 设置为值

java - Java从数组中获取特定元素

r - 在数据框中结转的上次观察结果?

regex - 带有正则表达式的字符串中第一个和最后一个非点的位置

r - 如何解析化学式以获得原子成分?

r - 从与变量匹配的另一列中查找值