【问题标题】:How to dynamically subset values and calculate the mean如何动态地对值进行子集化并计算平均值
【发布时间】:2013-03-14 06:04:45
【问题描述】:

我有一个包含三个变量(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") 

感谢任何帮助!

【问题讨论】:

    标签: r aggregate plyr subset


    【解决方案1】:

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

    但是这样的东西应该可以工作

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

    【讨论】:

    • 感谢您的评论。它给了我类型的平均 ACC,但我需要每个参与者的平均类型 ACC。我尝试在Type后添加ID,但没有成功。
    【解决方案2】:

    您对子集所做的操作太过分了。对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
    

    【讨论】:

      【解决方案3】:

      使用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 非常好!您还可以使用list(paste0('ACC_', Type) = as.list(V1)) 保留列名
      • 嗯,我不能实际上 +1 我没有选票了。但你有我的精神投票
      • @RicardoSaporta,setattr(., 'names', .) 更好。已编辑。
      • @RicardoSaporta,这不是问题所在。问题是它是as.list(.),你不能在不使用setNames(.) 的情况下为as.list 分配名称。 data.table 中的等价物是 setattr(., 'names', .)。即使有可能,执行list(as.list(.)) 也会导致列类型为列表。
      • 哇,我试过了,效果很好,谢谢大家的帮助!!
      猜你喜欢
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2019-01-27
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      相关资源
      最近更新 更多