当我需要按顺序将多个函数应用于多个列并按多列聚合并希望将结果绑定到数据框时,我通常以下列方式使用 aggregate()
:
# bogus functions
foo1 <- function(x){mean(x)*var(x)}
foo2 <- function(x){mean(x)/var(x)}
# for illustration purposes only
npk$block <- as.numeric(npk$block)
subdf <- aggregate(npk[,c("yield", "block")],
by = list(N = npk$N, P = npk$P),
FUN = function(x){c(col1 = foo1(x), col2 = foo2(x))})
通过使用:
实现将结果放在有序的数据框中df <- do.call(data.frame, subdf)
我是否可以在此方案中以某种方式使用do.call()
更聪明地避开 aggregate()
的呼叫,或者通过使用其他基础来缩短整个过程{ {1}}从一开始的解决方案?
答案 0 :(得分:2)
正如@akrun建议的那样,dplyr
summarise_each
非常适合这项任务。
library(dplyr)
npk %>%
group_by(N, P) %>%
summarise_each(funs(foo1, foo2), yield, block)
# Source: local data frame [4 x 6]
# Groups: N
#
# N P yield_foo2 block_foo2 yield_foo1 block_foo1
# 1 0 0 2.432390 1 1099.583 12.25
# 2 0 1 1.245831 1 2205.361 12.25
# 3 1 0 1.399998 1 2504.727 12.25
# 4 1 1 2.172399 1 1451.309 12.25
答案 1 :(得分:0)
您可以使用
df=data.frame(as.list(aggregate(...