如何动态子集值并计算均值

时间:2013-03-24 19:57:34

标签: r aggregate plyr subset

我有一个包含三个变量(ACC和类型和ID)的数据框,其中ACC指的是决策的准确性,类型指的是30种不同的决策类型,每个决策类型重复15次,超过参与者和ID指的是参与者。它看起来像这样:

ID     ACC     Type
1       1       1
1       0       3   
1       1      10
etc...
2       1       5
2       0      13
2       0      11
etc...

我的目标是分析参与者中每种决策类型的准确性,并将数据合并到数据框中。如:

ID    ACC_Type1     ACC_Type2 […]  ACC_Type30
1       70             65             87
2       65             50             90
etc...

到目前为止,我能够通过单独量化决策类型来计算,但是,我正在寻找一种更智能的方法来避免单独键入决策类型值:

library(data.table)
library(plyr)
dt <- data.table(d,key="Type")
dt_Type1<-data.frame (aggregate(ACC~ID,data=subset(dt,Type==1),mean))
dt_Type2<-data.frame (aggregate(ACC~ID,data=subset(dt,Type==2),mean))
[]
dt_Type30<-data.frame (aggregate(ACC~ID,data=subset(dt,Type==30),mean))

total <- merge(dt_Type1,dt_Type2 […] Type30,by="ID") 

感谢任何帮助!

3 个答案:

答案 0 :(得分:5)

使用Ananda的数据,可以获得data.table解决方案:

require(data.table)
dt <- data.table(mydf)
setkey(dt, "TYPE", "ID")
dt[, mean(ACC), by=key(dt)][, setattr(as.list(V1), 'names', 
                paste0("ACC", ID)), by=TYPE]
#    TYPE ACC1 ACC2 ACC3
# 1:    1  3.0  2.5  3.0
# 2:    2  1.5  2.0  3.0
# 3:    3  4.0  2.0  4.5

答案 1 :(得分:1)

你在子集上做的事情是矫枉过正的。对aggregate的基本调用就足够了。此外,要获得所需的输出,您需要使用reshape。这是一个例子:

示例数据:

set.seed(1)
mydf <- data.frame(
  ID = rep(1:3, each = 6),
  ACC = sample(0:5, 18, replace = TRUE),
  TYPE = rep(1:3, 6)
)

第1步:聚合

temp <- aggregate(ACC ~ ID + TYPE, mydf, mean)
temp
#   ID TYPE ACC
# 1  1    1 3.0
# 2  2    1 2.5
# 3  3    1 3.0
# 4  1    2 1.5
# 5  2    2 2.0
# 6  3    2 3.0
# 7  1    3 4.0
# 8  2    3 2.0
# 9  3    3 4.5

第2步:重塑

reshape(temp, direction = "wide", idvar = "ID", timevar = "TYPE")
#   ID ACC.1 ACC.2 ACC.3
# 1  1   3.0   1.5   4.0
# 2  2   2.5   2.0   2.0
# 3  3   3.0   3.0   4.5

更新

来自“reshape2”的

dcast可以使用fun.aggregate参数一步完成此操作,但您需要进行一些清理来修复名称。

> dcast(mydf, ID ~ TYPE, fun.aggregate = mean, value.var = "ACC")
  ID   1   2   3
1  1 3.0 1.5 4.0
2  2 2.5 2.0 2.0
3  3 3.0 3.0 4.5

答案 2 :(得分:0)

如果DTdata.table,那么您可以使用by=Type (当然发布一些样本数据有助于产生更准确的答案):

但是这样的事情应该有用

  DT[,  mean(ACC),  by = Type]