如何将不同的聚合函数应用于R中的不同列?

时间:2012-05-22 13:10:38

标签: r plyr data.table

如何将不同的聚合函数应用于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

如何将不同的函数应用于每列,即使用V2函数聚合mean(),使用V2函数聚合sum() ,多次不致电aggregate()

3 个答案:

答案 0 :(得分:9)

对于该任务,我将在ddply

中使用plyr
> 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

答案 1 :(得分:4)

...或者同名包中的函数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

答案 2 :(得分:2)

让我们调用已经采用的数据帧x而不是sample

编辑:

by功能提供比分割/应用/组合

更直接的路由
by(x, list(x$V1), f)

:EDIT

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")))