R:根据其他值和具有相同键的其他行的平均值有条件地选择行



这应该很简单,但我不知道如何正确地完成。给定以下示例数据帧:

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

最新更新