首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何动态子集值和计算平均值

如何动态子集值和计算平均值
EN

Stack Overflow用户
提问于 2013-03-25 03:57:34
回答 3查看 1.2K关注 0票数 0

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

代码语言:javascript
复制
ID     ACC     Type
1       1       1
1       0       3   
1       1      10
etc...
2       1       5
2       0      13
2       0      11
etc...

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

代码语言:javascript
复制
ID    ACC_Type1     ACC_Type2 […]  ACC_Type30
1       70             65             87
2       65             50             90
etc...

到目前为止,我可以通过单独设置决策类型的子集来计算,然而,我正在寻找一种更智能的方法来避免单独输入决策类型值:

代码语言:javascript
复制
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") 

如有任何帮助,我们不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-25 04:42:10

使用阿南达的数据,可以获得如下的data.table解决方案:

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2013-03-25 04:09:45

你对子集所做的是大材小用。对aggregate的基本调用应该就足够了。此外,要获得所需的输出,您需要使用reshape。下面是一个例子:

示例数据:

代码语言:javascript
复制
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:聚合

代码语言:javascript
复制
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:重塑

代码语言:javascript
复制
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参数一步到位地处理这个问题,但是您需要做一些清理工作来修复名称。

代码语言:javascript
复制
> 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
票数 1
EN

Stack Overflow用户

发布于 2013-03-25 04:06:12

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

但是像这样的东西应该是可行的

代码语言:javascript
复制
  DT[,  mean(ACC),  by = Type]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15603270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档