【问题标题】:Table for dummies in RR中的假人表
【发布时间】:2020-07-27 15:24:00
【问题描述】:

假设我的数据如下所示。列v1-v3w1-w3 分别是名为VW 的变量的虚拟变量。

v1 v2 v3 w1 w2 w3
 1  0  0  0  1  0
 0  1  0  0  0  1
 0  0  1  1  0  0 
 1  0  0  0  1  0
 0  1  0  0  0  1
 0  0  1  1  0  0 

我的意图是生成一个频率表,将v1, v2, v3 视为行,w1, w2, w3 视为列。非常感谢任何帮助!

【问题讨论】:

    标签: r dummy-variable


    【解决方案1】:

    我们可以将unlist前三列变成一个向量,类似于最后三列并应用table

    table(v = unlist(df1[1:3]), w = unlist(df1[4:6]))
    

    如果 OP 打算进行组合相等,那么一个选项是 outer

    out <- outer(1:3, 4:6, FUN =  Vectorize(function(i, j) sum(df1[[i]] == df1[[j]])))
    dimnames(out) <- list(names(df1)[1:3], names(df1)[4:6])
    
    out
    #   w1 w2 w3
    #v1  2  6  2
    #v2  2  2  6
    #v3  6  2  2
    

    数据

    df1 <- structure(list(v1 = c(1, 0, 0, 1, 0, 0), v2 = c(0, 1, 0, 0, 1, 
    0), v3 = c(0, 0, 1, 0, 0, 1), w1 = c(0, 0, 1, 0, 0, 1), w2 = c(1, 
    0, 0, 1, 0, 0), w3 = c(0, 1, 0, 0, 1, 0)), class = "data.frame", 
    row.names = c(NA, 
    -6L))
    

    【讨论】:

    • 这只会产生一个表。
    • @Gada 您能否在帖子中显示您的预期输出,因为不清楚
    • @Gada 你需要lapply(split.default(df1, sub("\\d+$", "", names(df1))), function(x) table(unlist(x)))
    • 啊,很好。还有一种我不知道的更优雅的方式;)我几乎可以肯定没有循环是可能的。 outer() 函数是我需要记住的。
    【解决方案2】:

    恐怕我只能用循环来做到这一点。在 R 中可能有一种更优雅的方法可以做到这一点,但至少它有效。

    当使用 v1-3 作为行并将 w1-3 作为列时,我不知道您想在单元格中放入什么。您可以输入值相同或值为 1 的时间。或任何其他公式。在下面的例子中,我尝试了两种不同的方式(一种被注释掉了)

    dta = data.frame(v1=c(1,0,0,1,0,0),
                     v2=c(0,1,0,0,1,0),
                     v3=c(0,0,1,0,0,1),
                     w1=c(0,0,1,0,0,1),
                     w2=c(1,0,0,1,0,0),
                     w3=c(0,1,0,0,1,0))
    
    
    t = matrix(NA,nrow=3,ncol=3)
    colnames(t)=names(dta[4:6])
    rownames(t)=names(dta[1:3])
    for(r in rownames(t)){
      for(c in colnames(t)){
        t[r,c]=sum(dta[[r]]==dta[[c]]) ## Agreement
        #t[r,c]=sum(dta[[r]]==1 & dta[[c]]==1) ## Both are 1
      }
    }
    

    脚本首先创建表格,然后遍历所有单元格以使用正确的值填充它们,并从原始数据集中获取信息。

    为了达成一致,这个矩阵将导致:

    > print(t)
       w1 w2 w3
    v1  2  6  2
    v2  2  2  6
    v3  6  2  2
    

    也就是说,比如v1和w2在6个情况下一致,而v1和w1的一致只有2个。

    【讨论】:

    • 我可以再问你一个问题吗?是否可以计算一些有助于我们衡量协议水平的统计数据(如应急系数或其他)? Tnx!
    • 当然可以。在循环的最里面部分,t[r,c] 被定义,你有两个向量可以使用。矢量dta[[r]] 是 v 列,dta[[c]] 是您为该单元格设置的 w 列。您可以使用任何采用两个相等长度的虚拟向量来计算统计数据的函数(例如:Agreement、Precision、Recall、Kappa、Krippendorff 的 Alpha、Sokal 距离……)。只需使用这两个向量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多