Table 用于 R 中的假人

Table for dummies in R

假设我的数据如下。 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 

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

我们可以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))

恐怕只能用循环来做。在 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
  }
}

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

为了达成一致,该矩阵的结果为:

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

这意味着,例如v1和w2在6种情况下一致,而v1和w1的一致只有2。