我有一个包含三个变量(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") 如有任何帮助,我们不胜感激!
发布于 2013-03-25 04:42:10
使用阿南达的数据,可以获得如下的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-25 04:09:45
你对子集所做的是大材小用。对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发布于 2013-03-25 04:06:12
如果DT是您的data.table,那么您可以使用by=Type (当然,发布一些示例数据将有助于生成更准确的答案):
但是像这样的东西应该是可行的
DT[, mean(ACC), by = Type]https://stackoverflow.com/questions/15603270
复制相似问题