【问题标题】:Any way to do filtering as well as summarizing in ddply?有什么方法可以在 ddply 中进行过滤和汇总?
【发布时间】:2014-09-07 01:31:56
【问题描述】:

我刚开始使用ddply 并发现它非常有用。我想汇总一个数据框,并根据汇总列是否具有特定值来删除最终输出中的某些行。这就像 SQL 中的 HAVINGGROUP BY。这是一个例子:

input = data.frame(id=     c( 1, 1, 2, 2, 3,   3),
                   metric= c(30,50,70,90,40,1050),
                   badness=c( 1, 5, 7, 3, 3,  99))
intermediateoutput = ddply(input, ~ id, summarize,
                           meanMetric=mean(metric),
                           maxBadness=max(badness))
intermediateoutput[intermediateoutput$maxBadness < 50,1:2]

这给出了:

  id meanMetric
1  1         40
2  2         80

这是我想要的,但我可以在ddply 语句中以某种方式一步完成吗?

【问题讨论】:

  • 如果您还没有对plyr 非常投入,那么您可能会从直接访问dplyr 中受益,这是新的改进版本。
  • 只要确保你没有同时加载它们

标签: r plyr dplyr


【解决方案1】:

您应该尝试使用dplyr。它速度更快,而且代码更容易阅读和理解,尤其是如果您使用管道 (%&gt;%):

input %>%
    group_by(id) %>%
    summarize(meanMetric=mean(metric), maxBadness=max(badness)) %>%
    filter(maxBadness <50) %>%
    select(-maxBadness)

在@Arun 注释之后,您可以通过这种方式简化代码:

input %>%
    group_by(id) %>%
    filter(max(badness)<50) %>%
    summarize(meanMetric=mean(metric))

【讨论】:

  • dplyr 中是否有与as.data.table(input)[, list(meanMetric=mean(metric)[max(badness) &lt; 50]), by=id] 等效的方法?
  • 是的,你是对的@Arun(一如既往!)。代码可以简化,因为您不必计算 maxBadness 变量进行过滤。将其添加为编辑,我认为这或多或少等同于您的 data.table 代码。
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 2018-07-16
相关资源
最近更新 更多