【问题标题】:calculate frequency or percentage matrix in R计算R中的频率或百分比矩阵
【发布时间】:2020-03-04 11:27:13
【问题描述】:

如果我有以下情况:

mm <- matrix(0, 4, 3)
mm<-apply(mm, c(1, 2), function(x) sample(c(0, 1), 1))

> mm
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    0
[3,]    0    0    0
[4,]    1    0    1

如何输出一个矩阵,该矩阵表示两个值 = 1 的不同列的频率或百分比。例如 - 4 行中有两行,其中第 1 列和第 2 列都等于 1 (=0.5) 和 1 行共 4 列,其中第 2 列和第 3 列 = 1 (=0.25),所以在这种情况下,我需要:

     [,1]      [,2]      [,3]
[1,]    1      0.5       0.5
[2,]    0.5    1         0.25
[3,]    0.5    0.25      1

我对比较相同的列不感兴趣,所以默认情况下对角线保持在 1。

我想我可能会在 cor(mm) 的某个地方找到输出共同频率或共同百分比而不是相关系数的方法,但情况似乎并非如此。但最终输出的维度应该是 N × N 列矩阵作为 cor() 输出:

> cor(mm)
          [,1]      [,2]      [,3]
[1,] 1.0000000 0.5773503 0.5773503
[2,] 0.5773503 1.0000000 0.0000000
[3,] 0.5773503 0.0000000 1.0000000

但显然这些是相关系数,我只想用共同频率或共同百分比代替。

【问题讨论】:

    标签: r


    【解决方案1】:

    基本 R 解决方案使用crossprod,即,

    r <- `diag<-`(crossprod(mm)/nrow(mm),1)
    

    这样

    > r
         [,1] [,2] [,3]
    [1,]  1.0 0.50 0.50
    [2,]  0.5 1.00 0.25
    [3,]  0.5 0.25 1.00
    

    数据

    mm <- structure(c(1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1), .Dim = 4:3)
    

    【讨论】:

      【解决方案2】:
      set.seed(123)
      
      mm <- matrix(0, 4, 3)
      mm<-apply(mm, c(1, 2), function(x) sample(c(0, 1), 1))
      
      combinations <- expand.grid(1:ncol(mm), 1:ncol(mm))
      
      matrix(unlist(Map(function(x, y) {
        if (x == y) {
          res <- 1
        } else {
          res <- sum(mm[, x] * mm[, y]) / nrow(mm)
        }
        res
      }, combinations[, 1], combinations[, 2])), 3)
      
      # [,1] [,2] [,3]
      # [1,] 1.00 0.25  0.0
      # [2,] 0.25 1.00  0.5
      # [3,] 0.00 0.50  1.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-14
        • 1970-01-01
        • 2017-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多