我在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中做到这一点吗?
答案 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
包中的dcast
和reshape2
:
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
作为聚合函数
(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