2014-10-29 69 views
3

当我需要将多个函数按顺序应用于多列并按多列进行聚合并希望将结果绑定到数据框中时,我通常使用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()更聪明在这种情况下或缩短整个过程从另一个基地R解决方案从一开始?

+0

请注意,在'subdf'我也会有一个数据框。但它将是一个数据框,其中包含我想要避免的某些列中的矩阵! – 2014-10-29 07:15:23

+1

这个任务使用'data.table'非常简单(这是为什么这个包很受欢迎的几个原因之一)。我不认为你可以比你展示的方式更容易地在基本R中达到你想要的结果。 – nicola 2014-10-29 07:17:14

+2

@ lord.garbage我猜你不需要'cbind','do.call(data.frame,subdf)'就足够了。另一个选择是使用'dplyr'中的'summarise_each'。 – akrun 2014-10-29 07:20:03

回答

2

正如@akrun所示,dplyrsummarise_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

由于问题是否有一个更简单的基础'R'解决方案似乎是“不”,我会接受你的答案。 – 2014-10-29 10:09:44

相关问题