这应该很简单,但我不知道如何正确地完成。给定以下示例数据帧:
telar <- data.frame(name=c("uno","dos","tres","cuatro","cinco"), id=c(1,2,3,1,2), test=c(10,11,12,13,14))
telar
name id test
1 uno 1 10
2 dos 2 11
3 tres 3 12
4 cuatro 1 13
5 cinco 2 14
例如,我试图选择所有具有test值的行,该值低于数据帧telar中具有相同id值的所有值的平均值。
我已经按照id对值进行了适当的分组,并像这样计算了它们的平均值,但我不知道如何进行比较。
> summarise(group_by(telar, id), test=mean(test))
A tibble: 3 x 2
id test
<dbl> <dbl>
1 1 11.5
2 2 12.5
3 3 12
谢谢!
您可以简单地创建组并保留小于平均值的值,即
library(dplyr)
telar %>%
group_by(name, id) %>%
filter(test < mean(test)) %>%
ungroup()
毫无疑问,有一种方法可以在不使用data.table的情况下做到这一点,但我将其作为的解决方案提供
library(data.table)
setDT(telar)
telar[, avg := mean(test), by = id][test < avg]
注意,如果您在data.frame中进行进一步分析,我建议您使用setDF(telar)
返回data.frame
使用base R
,这可以通过ave
完成
telar[with(telar, test < ave(test, id, name)),]