【问题标题】:Find the number of times that each row of a matrix appears in another求一个矩阵的每一行出现在另一个矩阵中的次数
【发布时间】:2017-12-12 07:03:53
【问题描述】:

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

# 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 中出现 1 次。

以下是我的解决方案:

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

【问题讨论】:

    标签: r matrix


    【解决方案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) )
    

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

    【讨论】:

    • 谢谢!如何用apply 替换for 循环?
    • 更新答案给你一个应用版本
    【解决方案2】:

    使用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) 
    

    【讨论】:

    • dt &lt;- rbind(A, B) %&gt;% as_data_frame() %&gt;% group_by_all() %&gt;% count() 不是更简单吗?我不明白dt_unique &lt;- dt %&gt;% distinct() 和随后的left_join 背后的想法?
    • 感谢您的评论。 OP表示原始的行顺序很重要,所以我想保持顺序。
    • 啊,明白了。需要注意这一点。
    猜你喜欢
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多