我刚开始使用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
语句中的一个步骤中以某种方式做到这一点吗?
您应该尝试使用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))