代码之家  ›  专栏  ›  技术社区  ›  rnorouzian

计算一个变量的级别在另一个变量每个级别内的共现性

  •  1
  • rnorouzian  · 技术社区  · 3 年前

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

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

    对于此数据,预期输出应该是一个具有 下列的 6个独特元素 [row,col] 在其上 下三角形 NA 其他任何地方。

    这可能在中实现吗 R ?

    跨越所有级别 studyID , 1. 具有 2. 共发生31次。 [2,1]

    跨越所有级别 studyID , 1. 具有 3 共发生3次。 [3,1]

    跨越所有级别 studyID , 1. 具有 4 共发生1次。 [4,1]

    跨越所有级别 studyID , 2. 具有 3. 共发生3次。 [3,2]

    跨越所有级别 studyID , 2. 具有 4. 共发生1次。 [4,2]

    跨越所有级别 studyID , 3. 具有 4. 共发生1次。 [4,3]

    data <- read.csv("https://raw.githubusercontent.com/ilzl/i/master/pr.csv")[c(1,7)]
    
    0 回复  |  直到 3 年前
        1
  •  3
  •   Onyambu    3 年前
    `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
    
        2
  •  0
  •   wutao    3 年前

    您可以使用 group_by 计算的不同值的数量 post_id 在每个级别中 studyID ,对于共现,只计算产生的数量的多少倍 分组_ by 的成对 post_id 等于(不包括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