我正在尝试编写一个函数来用中位数替换列中的缺失值,并且该函数适用于因子/字符和数值。
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的函数,但是我也不知道如何使用它。无论如何,自定义功能就是我想要的。
上面的代码给我一个错误。
答案 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