在R中创建双模频率矩阵

jj9*_*246 5 r frequency matrix crosstab stata

我有一个数据框,看起来像这样:

CASENO    Var1   Var2   Resp1   Resp2
1          1      0      1      1
2          0      0      0      0
3          1      1      1      1
4          1      1      0      1
5          1      0      1      0
Run Code Online (Sandbox Code Playgroud)

数据集中有400多个变量.这只是一个例子.我需要在R中创建一个简单的频率矩阵(不包括案例编号),但该table功能不起作用.具体来说,我希望将一部分列交叉制表以创建双模频率矩阵.该表应如下所示:

       Var1    Var2
Resp1    3       1
Resp2    3       2
Run Code Online (Sandbox Code Playgroud)

在Stata中,命令是:

gen var = 1 if Var1==1
replace var= 2 if Var2==1

gen resp = 1 if Resp1==1
replace resp = 2 if Resp2==1

tab var resp
Run Code Online (Sandbox Code Playgroud)

Mar*_*pov 5

这个适用于任何数量的Var&Resps:

d <- structure(list(CASENO = 1:5, Var1 = c(1L, 0L, 1L, 1L, 1L), Var2 = c(0L,  0L, 1L, 1L, 0L), Resp1 = c(1L, 0L, 1L, 0L, 1L), Resp2 = c(1L,  0L, 1L, 1L, 0L)), .Names = c("CASENO", "Var1", "Var2", "Resp1", "Resp2"), class = "data.frame", row.names = c(NA, -5L))   

m <- as.matrix(d[,-1])
m2 <- t(m) %*% m
rnames <- grepl('Resp',rownames((m2)))
cnames <- grepl('Var',colnames((m2)))
m2[rnames,cnames]
Run Code Online (Sandbox Code Playgroud)

[更新] G.Grothendieck的评论中提供了一个更优雅的版本:

m <- as.matrix(d[,-1])
cn <- colnames(m); 
crossprod(m[, grep("Resp", cn)], m[, grep("Var", cn)])
Run Code Online (Sandbox Code Playgroud)

  • 另一个简化是`m < - as.matrix(d)`因为greps永远不会匹配第一列. (2认同)