用整个数据帧的中位数代替缺失的功能

时间:2019-06-19 07:22:48

标签: r replace missing-data median

我正在尝试编写一个函数来用中位数替换列中的缺失值,并且该函数适用于因子/字符和数值。

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的函数,但是我也不知道如何使用它。无论如何,自定义功能就是我想要的。

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

2 个答案:

答案 0 :(得分:1)

我们可以将[k for i, j in zip(l_name, l_depth) for k in [i]*j] mutate_if一起使用,因为median仅适用于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

答案 1 :(得分:1)

我认为您正在寻找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