查找矩阵的每一行在另一行中出现的次数

时间:2017-12-11 21:07:26

标签: r matrix

我们有两个矩阵,我们分别用A和B表示。目的是找到A的每一行出现在B中的次数,在向量x中记忆这些数字,其第i个元素对应于第i行的A.例如:

# A=
1 2 3
1 1 1
2 0 1
1 4 5

# B=
2 0 1
0 0 1
0 0 2

然后矢量x是:

0 0 1 0

因为行

1 2 3, 1 1 1, 1 4 5

在B中出现0次,而行

2 0 1

在B中出现一次。

以下是我的解决方案:

m3 <- rbind(A, B)
count(m3)

返回:

  x.1 x.2 x.3 freq
1   0   0   1    1
2   1   0   2    1
3   1   1   1    1
4   1   2   3    1
5   1   4   5    1
6   2   0   1    2

这不是令人满意的结果。正确的一个考虑到A的原始顺序(而B的剩余行的顺序无关紧要);在我们的例子中:

1   1   2   3    1
2   1   1   1    1
3   2   0   1    2
4   1   4   5    1
1   0   0   1    1
2   1   0   2    1

2 个答案:

答案 0 :(得分:1)

使用dplyr的解决方案。 m_final是最终输出。

library(dplyr)
dt <- rbind(A, B) %>%
  as_data_frame() 

dt_unique <- dt %>%
  distinct()

dt_count <- dt %>%
  group_by_all() %>%
  count()

m_final <- dt_unique %>%
  left_join(dt_count) %>%
  as.matrix()

m_final
#      V1 V2 V3 n
# [1,]  1  2  3 1
# [2,]  1  1  1 1
# [3,]  2  0  1 2
# [4,]  1  4  5 1
# [5,]  0  0  1 1
# [6,]  0  0  2 1

数据

A <- matrix(c(1, 2, 3,
              1, 1, 1,
              2, 0, 1,
              1, 4, 5), ncol = 3, byrow = TRUE)

B <- matrix(c(2, 0, 1,
              0, 0, 1,
              0, 0, 2), ncol = 3, byrow = TRUE) 

答案 1 :(得分:1)

这是一个简短的版本:

x <- vector()
for(i in 1:nrow(A)) x[i] = sum(colSums(!t(B) - A[i,] == 0) == 0)

或者你可以为apply循环使for更清晰。答案,

> x
[1] 0 0 1 0

这是apply版本:

x <- sapply(1:nrow(A), function(x) sum(colSums(!t(B) - A[x,] == 0) == 0) )

我确信它可以进一步简化。