【问题标题】:for loop to calculate mean by group (also ignore NA)for循环按组计算平均值(也忽略NA)
【发布时间】:2020-03-27 02:48:16
【问题描述】:

我想创建一个for loop

  1. 创建a1,a2,...a10作为组均值的变量
  2. 根据组变量groupid 计算变量 b1、b2、b3....b10 的平均值
  3. 为了在计算平均值时忽略 NA,我使用了na.rm=TRUE
df <- within(df, {a1 = ave(as.numeric(as.character(b1)), groupid, FUN=function(x) mean(x, na.rm=TRUE))})  
df <- within(df, {a2 = ave(as.numeric(as.character(b2)), groupid, FUN=function(x) mean(x, na.rm=TRUE))})
.
.
.
df <- within(df, {a10 = ave(as.numeric(as.character(b10)), groupid, FUN=function(x) mean(x, na.rm=TRUE))})

如何将这 10 行愚蠢的代码改写成优雅的for loop

【问题讨论】:

    标签: r for-loop group-by na


    【解决方案1】:

    由于groupid 是相同的,我们可以使用mutate_at 执行此操作,以获取模式为b\\d+ 的所有列的mean 作为列名,并以'a' 作为后缀创建新列

    library(dplyr)
    df %>%
       group_by(groupid) %>%
       mutate_at(vars(matches('^b\\d+$')), list(a = ~ mean(., na.rm = TRUE)))    
    

    【讨论】:

      【解决方案2】:

      也许可以试试下面的

      df <- sapply(1:10, function(k) eval(parse(text = sprintf("within(df, {a%d = ave(as.numeric(as.character(b%d)), groupid, FUN=function(x) mean(x, na.rm=TRUE))})",k,k))))
      

      【讨论】:

        猜你喜欢
        • 2020-03-28
        • 2016-12-22
        • 2019-08-19
        • 1970-01-01
        • 1970-01-01
        • 2017-08-28
        • 2021-02-02
        • 2021-04-16
        • 1970-01-01
        相关资源
        最近更新 更多