用整个数据帧的中值替换缺失的函数

Function to replace missing with median for whole dataframe

我正在尝试编写一个函数来用中位数替换列中的缺失值,这对 factors/characters 和数值都有效。

library(dplyr)
test = data.frame(a=1:6,b=c("a","b",NA,NA,NA,"c"),c=c(1,1,1,1,2,NA),d=c("a","a","c",NA,NA,"b"))

fun_rep_na = function(df){
  for(i in colnames(df)){
    j<-sym(i)
    df = df %>% mutate(!!j=if_else(is.na(!!j),median(!!j, na.rm=TRUE),!!j))
  }
}

我看到 tidyr 有一个名为 replace_na 的函数,但我也不确定如何使用它。无论如何,自定义函数是我想要的。

上面的代码给我一个错误。

我们可以将 mutate_ifmedian 一起使用,因为 median 仅适用于 numeric

test %>% 
   mutate_if(is.numeric, list(~ replace(., is.na(.), median(., na.rm = TRUE))))

如果我们想要重复次数最多的值,那么我们可能需要Mode

Mode <- function(x) {
  x <- x[!is.na(x)]
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

Mode 功能首次更新于此

test %>% 
  mutate_all(list(~ replace(., is.na(.), Mode(.))))
#  a b c d
#1 1 a 1 a
#2 2 b 1 a
#3 3 a 1 c
#4 4 a 1 a
#5 5 a 2 a
#6 6 c 1 b

我认为您正在寻找 Mode 而不是中位数

here

中提取 Mode 函数
Mode <- function(x) {
   ux <- unique(x)
   ux[which.max(tabulate(match(x, ux)))]
}

library(dplyr)

test %>%  mutate_all(~replace(., is.na(.), Mode(na.omit(.))))

#  a b c d
#1 1 a 1 a
#2 2 b 1 a
#3 3 a 1 c
#4 4 a 1 a
#5 5 a 2 a
#6 6 c 1 b