В базе R вы можете перебирать столбцы и использовать простой оператор if
. Нам нужно будет определить функцию для режима, поскольку база R не предоставляет ее.
df[-1] <- lapply(df[-1], function(x) {
if(is.factor(x)) replace(x, is.na(x), Mode(na.omit(x)))
else if(is.numeric(x)) replace(x, is.na(x), mean(x, na.rm=TRUE))
else x
})
df
# ID bflag vcount zfactor vnumber
# 1 1 0 12 1 12.00
# 2 2 1 8 0 8.00
# 3 3 0 3 0 9.00
# 4 4 1 13 0 7.75
# 5 5 1 2 1 2.00
# 6 6 1 10 0 7.75
Данные и Mode
функция:
df <- read.table(text = "ID bflag vcount zfactor vnumber
1 0 12 1 12
2 1 NA 0 8
3 0 3 0 9
4 1 13 0 NA
5 1 2 1 2
6 NA 10 NA NA",
colClasses = rep(c("numeric", "factor"), length.out=5),
header = TRUE)
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
Mode
позаимствовано у Есть ли встроенная функция для нахождения режима?