2

我在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 中做到这一点?

4

2 回答 2

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.

于 2012-05-15T13:44:02.087 回答
2

您可以使用包中的meltand :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

然后投射融化的data.frame,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
于 2012-05-15T13:44:24.380 回答