Table 用于 R 中的假人
Table for dummies in R
假设我的数据如下。 v1-v3
和 w1-w3
列分别是名为 V
和 W
的变量的虚拟变量。
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。
假设我的数据如下。 v1-v3
和 w1-w3
列分别是名为 V
和 W
的变量的虚拟变量。
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。