代码之家  ›  专栏  ›  技术社区  ›  Mehmed Andrew Lam

获取值大于组平均值的行

  •  0
  • Mehmed Andrew Lam  · 技术社区  · 6 年前

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

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

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

    4 回复  |  直到 6 年前
        1
  •  3
  •   neilfws    6 年前

    你可以 group 然后 filter :

    mydf %>%
      group_by(A) %>%
      filter(B > mean(B, na.rm = TRUE)) %>%
      ungroup()
    
        2
  •  4
  •   Ronak Shah    6 年前

    一个简单的R基选择 ave 会是

    df[df$b > ave(df$b, df$a) , ]
    
    #   a  b
    #4  1  4
    #5  1  5
    #9  2  9
    #10 2 10
    

    的默认参数 大道 mean 所以如果有 NA 存在于 b 修改为

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

    另一个解决方案 subset 大道 由@Onyambu建议

    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
    
        3
  •  3
  •   AntonySamuelB    6 年前

    使用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]
    
        4
  •  0
  •   Simon C.    6 年前

    另一种方法是使用基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)],] )