用整个数据帧的中值替换缺失的函数
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_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
功能首次更新于此
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
我正在尝试编写一个函数来用中位数替换列中的缺失值,这对 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_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
功能首次更新于此
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