获取值大于组均值的行

时间:2018-08-06 04:19:26

标签: r group-by dplyr

我有一个数据框,其中“ A”列具有6个不同的值。列“ B”具有浮点值。通过使用dplyr,我可以按“ A”列分组并找到每个组的“ B”列的平均值,如下所示:

mydf %>% group_by(A) %>% summarize(Mean = mean(B, na.rm=TRUE))

我的全部目标是在每个组中找到其“ B”值高于组平均值的行。如何实现(使用基数R或dplyr)?

4 个答案:

答案 0 :(得分:4)

以R为ave为基数的简单替代方法是

df[df$b > ave(df$b, df$a) , ]

#   a  b
#4  1  4
#5  1  5
#9  2  9
#10 2 10

ave的默认参数为mean,因此,如果NA中存在b值,则无需明确提及它,将其修改为

df[df$b > ave(df$b, df$a, FUN = function(x) mean(x,na.rm = TRUE)) , ]

@Onyambu建议使用subsetave的另一种解决方案

subset(df,b>ave(b,a))

#   a  b
#4  1  4
#5  1  5
#9  2  9
#10 2 10

数据

df <- data.frame(a = rep(c(1, 2), each = 5), b = 1:10)
df

#   a  b
#1  1  1
#2  1  2
#3  1  3
#4  1  4
#5  1  5
#6  2  6
#7  2  7
#8  2  8
#9  2  9
#10 2 10

答案 1 :(得分:3)

您可以先group,然后再filter

mydf %>%
  group_by(A) %>%
  filter(B > mean(B, na.rm = TRUE)) %>%
  ungroup()

答案 2 :(得分:3)

使用Base R,我会这样做。它不如dplyr优雅。

mean.df <- aggregate(mydf$b, by =list(a = mydf$a), FUN = mean)
names(mean.df)[2] <- "mean"
mydf <- merge(mydf, mean.df, by = "a")
# Rows whose values are higher than mean
new.df <- subset(mydf, b > mean, select = -mean)

我喜欢使用数据表。因此,data.table解决方案将会是

mydt <- data.table(mydf)
mydt[, mean := mean(b), by = a]
new.dt <- mydt[b > mean, -c("mean"), with = TRUE]

答案 3 :(得分:0)

使用基数R和tapply的另一种方法:

mydf = cbind.data.frame(A=sample(6,20,rep=T),B=runif(20))
mydf.ave = tapply(mydf$B,mydf$A,mean)
newdf = mydf[mydf$B > mydf.ave[as.character(mydf$A)],]

(因此,一个班轮是:mydf[mydf$B > tapply(mydf$B,mydf$A,mean)[as.character(mydf$A)],]