【问题标题】:Replace NA with grouped means in R? [duplicate]用 R 中的分组均值替换 NA? [复制]
【发布时间】:2019-03-22 13:55:44
【问题描述】:

我一直在尝试用手段替换 NA,非常感谢您的帮助。

我想用列内组的平均值替换数据框多列中的 NA。在下面的示例中,我想将 x1 中的 NA 替换为 14.5,因为 13 和 16 在第 1 个月。x2 中的 NA 应替换为 4.5。

这是我尝试过的方式:

library(tidyverse)

df <- tibble(x1 = c(13, NA, 16, 17, 16, 12), x2 = c(1, 4, 4, 3, 5, NA),
         month = c(1, 1, 1, 2, 2, 2))

by_month <- group_by(df, month)

for (i in length(df)){
   for (j in nrow(df[[,i]])){
     if(is.na(df[[j, i]])){
      df[[j, i]] <- summarize(by_month[[j, i]],
                                   group_mean = mean(df[[, i]], na.rm=TRUE))
    }
    else{
      df[[j, i]] <- df[[j, i]]
    }
  }
}

但是,我只是得到错误'参数“..1”丢失,没有默认值',我对此进行了调查 - 但它没有帮助。任何帮助都会很棒:)

【问题讨论】:

    标签: r loops dataframe tibble


    【解决方案1】:

    这是一个基本 R 解决方案,使用 avesapply-ing 到每一列 x1x2

    df[1:2] <- sapply(df[1:2], function(x){
      ave(x, df[[3]], FUN = function(.x) {
        .x[is.na(.x)] <- mean(.x, na.rm = TRUE)
        .x
      })
    })
    
    
    df
    ## A tibble: 6 x 3
    #     x1    x2 month
    #  <dbl> <dbl> <dbl>
    #1  13       1     1
    #2  14.5     4     1
    #3  16       4     1
    #4  17       3     2
    #5  16       5     2
    #6  12       4     2
    

    【讨论】:

      【解决方案2】:

      我稍微更改了您的示例,因为您提供的数据框具有不同长度的列,但这应该可以解决您的问题:

      首先,我在 tidyverse 中加载了包。然后我按月对数据进行分组。第二个管道运行 mutate_all 函数,因此它会自动更改所有列。

      library(tidyverse)
      
      df <- tibble(x1 = c(13, NA, 16, 17, 16, 12), x2 = c(1, 4, 3, 5, NA, 4),
                   month = c(1, 1, 1, 2, 2, 2))
      
      
      new_df <- df %>%  group_by(month) %>%
        mutate_all(funs(ifelse(is.na(.), mean(., na.rm = TRUE),.)))
      

      如果有任何帮助,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-02
        • 1970-01-01
        • 1970-01-01
        • 2019-10-11
        • 2021-12-12
        • 2019-11-26
        • 1970-01-01
        • 2020-08-25
        相关资源
        最近更新 更多