我有一个数据框,其中“ A”列具有6个不同的值。列“ B”具有浮点值。通过使用dplyr,我可以按“ A”列分组并找到每个组的“ B”列的平均值,如下所示:
mydf %>% group_by(A) %>% summarize(Mean = mean(B, na.rm=TRUE))
我的全部目标是在每个组中找到其“ B”值高于组平均值的行。如何实现(使用基数R或dplyr)?
答案 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建议使用subset
和ave
的另一种解决方案
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)],]
)