【问题标题】:Counting co-occurrence of levels of a variable within each level of another variable计算另一个变量的每个级别内一个变量的级别的共现
【发布时间】:2021-10-24 06:25:18
【问题描述】:

我的data 下面有两列(studyID & post_id)。 post_id 列有 4 个唯一值 (1 2 3 4)。

我想知道如何确定post_id 的每个唯一值(例如1)与post_id 的另一个唯一值(例如2)在@987654330 的每个级别中同时出现多少次@?

对于此数据,预期的输出应该是一个矩阵,以下 6 个唯一元素 [row,col] 在其下三角形NA 其他任何地方。

这可以在R中实现吗?

studyID12 的所有级别中同时出现 31 次。 [2,1]

studyID13 的所有级别中同时出现 3 次。 [3,1]

studyID14 的所有级别中同时出现 1 次。 [4,1]

studyID23 的所有级别中同时出现 3 次。 [3,2]

studyID24 的所有级别中同时出现 1 次。 [4,2]

studyID34 的所有级别中同时出现 1 次。 [4,3]

data <- read.csv("https://raw.githubusercontent.com/ilzl/i/master/pr.csv")[c(1,7)]

【问题讨论】:

    标签: r dataframe matrix dplyr tidyverse


    【解决方案1】:

    您可以使用group_by来统计studyID的每一级中post_id的不同值的数量,对于共现,只计算成对@987654325的group_by产生的数量的多少次@ 等于(不包括 0):

    library(dplyr)
    data <- read.csv("https://raw.githubusercontent.com/ilzl/i/master/pr.csv")[c(1,7)]
    data %>% 
      group_by(studyID) %>% 
      summarise(`1`=sum(post_id==1),
                `2`=sum(post_id==2),
                `3`=sum(post_id==3),
                `4`=sum(post_id==4)) -> a
    
    mat <- matrix(rnorm(16),nrow = 4,ncol = 4)
    rownames(mat) <- colnames(a)[2:5]
    colnames(mat) <- colnames(a)[2:5]
    
    for (i in colnames(mat)){
      for (j in rownames(mat)){
        tmp <- a %>% select(i,j)
        tmp[tmp == 0] <- NA 
        tmp <- na.omit(tmp)
        mat[i,j] <- sum(tmp[,i] == tmp[,j])
      }
    }
    mat[!lower.tri(mat, diag = FALSE)] <- NA
    

    【讨论】:

      【解决方案2】:
      `diag<-`(crossprod(table(data)>0), 0)
      
             post_id
      post_id  1  2 3 4
            1  0 31 3 1
            2 31  0 3 1
            3  3  3 0 1
            4  1  1 1 0
      

      【讨论】:

      • 看来我迟到了 10 分钟 (Matrix::tril(crossprod(table(data)&gt;0), -1))。很好的答案
      • @Reza。我很抱歉,但代码是不言自明的。这个想法本质上是数学而不是编程。即crossprod 是矩阵乘法。我们通过简单地将每个 studyID 的 post_id 的存在点乘以来计算关系的数量
      • @rnorouzian 完全按照问题中的说明整合结果。注意它是一个对称矩阵
      • @rnorouzian 是的,在 31 个级别中,1 和 2 都存在。
      • 我在您上面的回答中遇到了后续行动。如果我这样做 tab &lt;- table(data); gg = colSums(tab) gg 会给出什么?我认为它给出了data 在所有studyID 级别中出现post_id 的每个级别的行数。但是,我们如何获得data 的行数,以使post_id 的每个级别(例如1)与post_id 的另一个级别(例如2)在所有@987654334 中同时出现@ 级别?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2018-07-27
      • 2016-10-13
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      相关资源
      最近更新 更多