0

我有一个包含三个变量(ACC、Type 和 ID)的数据框,其中 ACC 是指决策的准确性,Type 是指 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") 

任何帮助表示赞赏!

4

3 回答 3

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
于 2013-03-24T20:42:10.170 回答
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

第二步:重塑

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

更新

dcastfrom "reshape2" 可以通过它的参数一步处理这个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
于 2013-03-24T20:09:45.007 回答
0

如果DT 是您的data.table,那么您可以使用by=Type (当然发布一些示例数据将有助于生成更准确的答案):

但这样的事情应该有效

  DT[,  mean(ACC),  by = Type]
于 2013-03-24T20:06:11.883 回答