我刚开始使用ddply
并发现它非常有用。我想总结一个数据框,并根据汇总列是否具有特定值来删除最终输出中的某些行。这与SQL中的HAVING
和GROUP 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
语句中以一个步骤单独执行吗?
答案 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))