【问题标题】:How can I apply different aggregate functions to different columns in R?如何将不同的聚合函数应用于 R 中的不同列?
【发布时间】:2012-05-22 13:10:38
【问题描述】:

如何将不同的聚合函数应用于 R 中的不同列? aggregate() 函数只提供一个要传递的函数参数:

V1  V2        V3
1   18.45022  62.24411694
2   90.34637  20.86505214
1   50.77358  27.30074987
2   52.95872  30.26189013
1   61.36935  26.90993530
2   49.31730  70.60387016
1   43.64142  87.64433517
2   36.19730  83.47232907
1   91.51753  0.03056485
... ...       ...

> aggregate(sample,by=sample["V1"],FUN=sum)
  V1 V1       V2       V3
1  1 10 578.5299 489.5307
2  2 20 575.2294 527.2222

如何将 不同 函数应用于每一列,即聚合 V2mean() 函数和 V2sum() 函数,而无需多次调用 aggregate() ?

【问题讨论】:

  • @mdsumner 当然也可以欣赏任何其他漂亮名字的功能

标签: r plyr data.table


【解决方案1】:

对于该任务,我将在plyr 中使用ddply

> library(plyr)
> ddply(sample, .(V1), summarize, V2 = sum(V2), V3 = mean(V3))
  V1       V2       V3
1  1 578.5299 48.95307
2  2 575.2294 52.72222

【讨论】:

  • 我真的很喜欢 plyr 的简单性。我在 stackoverflow 上了解了这个包后开始使用它。
  • 太好了!这里的“总结”论点有什么魔力?编辑:明白了,这就是应用了稍后传递的附加参数的实际函数。
【解决方案2】:

...或者同名包中的函数data.table

library(data.table)

myDT <- data.table(sample) # As mdsumner suggested, this is not a great name

myDT[, list(sumV2 = sum(V2), meanV3 = mean(V3)), by = V1]

#      V1    sumV2   meanV3
# [1,]  1 578.5299 48.95307
# [2,]  2 575.2294 52.72222

【讨论】:

    【解决方案3】:

    让我们将数据框称为x,而不是已经采用的sample

    编辑:

    by 函数提供了比 split/apply/combine 更直接的路由

    by(x, list(x$V1), f)
    

    :编辑

    lapply(split(x, x$V1), myfunkyfunctionthatdoesadifferentthingforeachcolumn)
    

    当然,这不是每一列的单独功能,但一个人可以同时完成这两项工作。

    myfunkyfunctionthatdoesadifferentthingforeachcolumn = function(x) c(sum(x$V2), mean(x$V3))
    

    整理结果的方便方法是可能的(但请查看 plyr 包以获得全面的解决方案,考虑这种动机以更好地学习一些东西)。

     matrix(unlist(lapply(split(x, x$V1), myfunkyfunctionthatdoesadifferentthingforeachcolumn)), ncol = 2, byrow = TRUE, dimnames = list(unique(x$V1), c("sum", "mean")))
    

    【讨论】:

    • 很高兴知道!不过,我确实更喜欢绕过实现中间函数的额外工作,因此 kohske 建议的包正是我想要的:)
    猜你喜欢
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多