用R中的分组均值替换NA?

cho*_*olz 0 loops r dataframe tibble

我一直坚持尝试用手段替代NA,我将非常感谢您的帮助。

我想用该列中一组的平均值替换数据框的多个列中的NA。在下面的示例中,我想将x1中的NA替换为14.5,因为第1个月中有13和16。NA2中的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]]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我只是得到了我调查的错误“参数“ ..1”丢失,没有默认值“,但这并没有帮助。任何帮助将是巨大的:)

小智 6

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

首先,我将包加载到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),.)))
Run Code Online (Sandbox Code Playgroud)

让我知道这是否有帮助。