在 R 中创建双模式频率矩阵
Create a two-mode frequency matrix in R
我有一个数据框,看起来像这样:
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
数据集中有 400 多个变量。这只是一个例子。我需要在 R 中创建一个简单的频率矩阵(不包括案例编号),但 table
函数不起作用。具体来说,我希望对列的一部分进行交叉制表,以创建一个双模频率矩阵。 table 应如下所示:
Var1 Var2
Resp1 3 1
Resp2 3 2
在 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
我确定还有另一种方法,但您可以这样做:
library(reshape2)
library(plyr)
df1 <- melt(df[,-1],id=1:2)
ddply(df1,.(variable),summarize,
Var1 = sum(value==1&Var1==1),
Var2 = sum(value==1&Var2==1))
# variable Var1 Var2
# 1 Resp1 3 1
# 2 Resp2 3 2
这个应该适用于任意数量的 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]
[更新] 一个更优雅的版本,在 G.Grothendieck 的评论中提供:
m <- as.matrix(d[,-1])
cn <- colnames(m);
crossprod(m[, grep("Resp", cn)], m[, grep("Var", cn)])
这是一种使用 xtabs
的方法。
# get names of non "variables"
not_vars <- c("Resp1", "Resp2", "CASENO")
# get names of "variables"
vars <- as.matrix(d[,!names(d) %in% not_vars])
# if you have many more than 2 response variables, this could get unwieldy
result <- rbind(
xtabs( vars ~ Resp1, data=d, exclude=0),
xtabs( vars ~ Resp2, data=d, exclude=0))
# give resulting table appropriate row names.
rownames(result) <- c("Resp1", "Resp2")
# Var1 Var2
#Resp1 3 1
#Resp2 3 2
示例数据:
d <- read.table(text="
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", header=TRUE)
我有一个数据框,看起来像这样:
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
数据集中有 400 多个变量。这只是一个例子。我需要在 R 中创建一个简单的频率矩阵(不包括案例编号),但 table
函数不起作用。具体来说,我希望对列的一部分进行交叉制表,以创建一个双模频率矩阵。 table 应如下所示:
Var1 Var2
Resp1 3 1
Resp2 3 2
在 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
我确定还有另一种方法,但您可以这样做:
library(reshape2)
library(plyr)
df1 <- melt(df[,-1],id=1:2)
ddply(df1,.(variable),summarize,
Var1 = sum(value==1&Var1==1),
Var2 = sum(value==1&Var2==1))
# variable Var1 Var2
# 1 Resp1 3 1
# 2 Resp2 3 2
这个应该适用于任意数量的 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]
[更新] 一个更优雅的版本,在 G.Grothendieck 的评论中提供:
m <- as.matrix(d[,-1])
cn <- colnames(m);
crossprod(m[, grep("Resp", cn)], m[, grep("Var", cn)])
这是一种使用 xtabs
的方法。
# get names of non "variables"
not_vars <- c("Resp1", "Resp2", "CASENO")
# get names of "variables"
vars <- as.matrix(d[,!names(d) %in% not_vars])
# if you have many more than 2 response variables, this could get unwieldy
result <- rbind(
xtabs( vars ~ Resp1, data=d, exclude=0),
xtabs( vars ~ Resp2, data=d, exclude=0))
# give resulting table appropriate row names.
rownames(result) <- c("Resp1", "Resp2")
# Var1 Var2
#Resp1 3 1
#Resp2 3 2
示例数据:
d <- read.table(text="
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", header=TRUE)