【问题标题】:Applying multiple functions to each column in a data frame using aggregate使用聚合将多个函数应用于数据框中的每一列
【发布时间】:2014-12-24 19:36:42
【问题描述】:

当我需要将多个函数顺序应用到多列并按多列聚合并希望将结果绑定到数据框中时,我通常以以下方式使用 aggregate(): p>

# 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() smarter 或者通过使用另一个基础R 解决方案来缩短整个过程开始?

【问题讨论】:

  • 请注意,在subdf 我也会有一个数据框。但这将是一个数据框,其中包含我非常想避免的某些列中的矩阵!
  • 使用data.table 完成这项任务非常简单(这也是该软件包如此受欢迎的几个原因之一)。我不认为你可以比你展示的方式更容易地在基础 R 中实现你想要的结果。
  • @lord.garbage 我猜你不需要cbinddo.call(data.frame, subdf) 就足够了。另一种选择是使用来自dplyrsummarise_each
  • @akrun,干杯。我会相应地修改问题。

标签: r aggregate split-apply-combine


【解决方案1】:

你可以使用

df=data.frame(as.list(aggregate(...

【讨论】:

    【解决方案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
    

    【讨论】:

    • 问题是否有更简单的基础R 解决方案似乎是“否”,我会接受你的回答。
    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多