Это решение сложное, но его использование простое.
Я создаю обобщенный c delna
и методы
- Метод по умолчанию, чтобы заменить
NA
в один номер c вектор; - Метод для объектов класса
"matrix"
; - Метод для объектов класса
"data.frame"
; - Метод для объектов класса
"list"
.
Тогда все, что нужно сделать, это позвонить delna(object)
и все автоматически c.
delna <- function(x, ...) UseMethod("delna")
delna.default <- function(x, ...){
stopifnot(is.numeric(x))
mu <- mean(x, na.rm = TRUE)
x[is.na(x)] <- mu
x
}
delna.matrix <- function(x, ...){
x[] <- apply(x, 2, delna)
x
}
delna.data.frame <- function(x, ...){
is_num <- sapply(x, is.numeric)
x[is_num] <- lapply(x[is_num], delna)
x
}
delna.list <- function(x, ...){
is_num <- sapply(x, is.numeric)
x[is_num] <- lapply(x[is_num], delna)
x
}
delna(letters)
delna(x)
delna(mat)
delna(dat)
delna(as.list(dat))
Проверить код создания данных.
set.seed(1234)
x <- sample(10)
is.na(x) <- sample(10, 4)
mat <- replicate(5, {
x <- sample(10)
is.na(x) <- sample(10, 3)
x
})
dat <- as.data.frame(mat)