有什么方法可以在ddply中进行过滤和汇总吗?

时间:2014-07-16 13:31:21

标签: r plyr dplyr

我刚开始使用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语句中以一个步骤单独执行吗?

1 个答案:

答案 0 :(得分:11)

您应该尝试使用dplyr。它更快,代码更容易阅读和理解,特别是如果你使用管道(%>%):

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