【问题标题】:Find frequency of vector elements in a matrix查找矩阵中向量元素的频率
【发布时间】:2017-06-08 15:18:48
【问题描述】:

我在 R 中有一个矩阵,这是一个小例子:

set.seed(1)
n.columns<-6
mat <- matrix(, nrow = 5, ncol = n.columns)
for(column in 1:n.columns){
  mat[, column] <- sample(1:10,5)
}
mat

矩阵如下所示:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    3    9    3    5   10    4
[2,]    4   10    2    7    2    1
[3,]    5    6    6    8    6   10
[4,]    7    5   10    3    1    7
[5,]    2    1    5   10    9    3

我还有一个整数向量vv&lt;-c(1,3,6),其元素理论上可​​以出现在上面的矩阵mat中。

我正在寻找的是v 中的每个元素出现在mat 中的次数的概览每列。对于当前示例,此概述是

1: 0 1 0 0 1 1
3: 1 0 1 1 0 1
6: 0 1 1 0 1 0

使用for-loops 和if-statements 执行此操作相当简单,但此解决方案不是很漂亮。

有没有专业的方法可以做到这一点?

【问题讨论】:

    标签: r matrix vector frequency


    【解决方案1】:

    一个使用sapply的选项:

    t(sapply(v, function(a) colSums(mat==a)))
    
    #     [,1] [,2] [,3] [,4] [,5] [,6]
    #[1,]    0    1    0    0    1    1
    #[2,]    1    0    1    1    0    1
    #[3,]    0    1    1    0    1    0
    

    【讨论】:

    • 您当然可以设置行名,如rownames(res) &lt;- as.character(v),其中res 是结果矩阵。
    【解决方案2】:

    使用table:

    table(mat[mat %in% v], col(mat)[mat %in% v])
    
    #   1 2 3 4 5 6
    # 1 0 1 0 0 1 1
    # 3 1 0 1 1 0 1
    # 6 0 1 1 0 1 0
    

    缺点是所有值不在v 中的列将不会被报告。

    【讨论】:

      【解决方案3】:

      在 data.frame 上使用 sapply 迭代列。

      setNames(object = as.data.frame(sapply(v, function(a)
               sapply(as.data.frame(mat), function(b)
                                   sum(a %in% b)))), nm = v)
      #   1 3 6
      #V1 0 1 0
      #V2 1 0 1
      #V3 0 1 1
      #V4 0 1 0
      #V5 1 0 1
      #V6 1 1 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-15
        • 2013-01-03
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 2011-09-19
        相关资源
        最近更新 更多