我有一个包含三个变量(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")
感谢任何帮助!
答案 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
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)
如果DT
是data.table
,那么您可以使用by=Type
(当然发布一些样本数据有助于产生更准确的答案):
但是这样的事情应该有用
DT[, mean(ACC), by = Type]