用R语言计算列联表

时间:2012-05-15 07:04:07

标签: r statistics frequency

我在R中有一个数据集如下

ID  Variable1  Variable2 Choice
1   1          2         1
1   2          1         0
2   2          1         1
2   2          1         1

我需要在

下获取输出表
Id Variable1-1 Variable1-2 Variable2-1 Variable2-2
1  1           0           0           1
2  0           2           2           0

请注意,只有那些行被计算在选项为1的位置(选项是二进制变量,但其他变量具有任何整数值)。目标是为变量提供尽可能多的列作为其级别。

我有可能在R中做到这一点吗?

2 个答案:

答案 0 :(得分:2)

我花了一段时间来弄清楚你在追求什么,但我得到了它(我想)。我已经完成了你的要求,但它充其量是令人费解的。我认为这将有助于其他人看到你所追求的东西,现在你会得到更好的答案。

dat <- read.table(text="ID  Variable1  Variable2 Choice
1   1          2         1
1   2          1         0
2   2          1         1
2   2          1         1", header=T)


A <- split(dat$Choice, list(dat$Variable1, dat$ID))
B <- split(dat$Choice, list(dat$Variable2, dat$ID))
C <- list(A, B)

FUN <- function(x) sapply(x, function(y) sum(y))

FUN2 <- function(x){
    len <- length(x)/2
    rbind(x[1:len], x[(len+1):length(x)])
}

dat2 <- do.call('data.frame', lapply(lapply(C, FUN), FUN2))
colnames(dat2) <- c('Variable1-1', 'Variable1-2', 'Variable2-1', 
    'Variable2-2')
dat2

这不是你祖母的应变表,这是肯定的。可能有更好的方法来完成所有这些,可能是reshape

答案 1 :(得分:2)

您可以使用melt包中的dcastreshape2

mydf<-read.table(text="ID  Variable1  Variable2 Choice
1   1          2         1
1   2          1         0
2   2          1         1
2   2          1         1",header=TRUE)

library(reshape2)

首先融合data.frame,只选择那些Choice == 1的行并删除Choice

mydfM <- melt(mydf[mydf$Choice %in% 1, -match("Choice", names(mydf))], id = "ID")

# EDIT above: As @TylerRinker points out, using which could be avoided.
# I've replaced it with %in%

#   ID  variable value
# 1  1 Variable1     1
# 2  2 Variable1     2
# 3  2 Variable1     2
# 4  1 Variable2     2
# 5  2 Variable2     1
# 6  2 Variable2     1

然后使用length作为聚合函数

来转换融合的data.frame
(mydfC <- dcast(mydfM, ID ~ variable + value, fun.aggregate = length))

#   ID Variable1_1 Variable1_2 Variable2_1 Variable2_2
# 1  1           1           0           0           1
# 2  2           0           2           2           0