这里有几种方法。测试数据框DF 在(1)中定义,也用于其他方法。
1) dplyr - 交叉/合并
library(dplyr)
# test data
DF <- data.frame(a = c(NA, NA, 1, 2), b = 1:4, c = letters[1:4])
DF %>%
mutate(across(where(is.numeric), ~ coalesce(., median(., na.rm = TRUE))))
给予:
a b c
1 1.5 1 a
2 1.5 2 b
3 1.0 3 c
4 2.0 4 d
2) dplyr/tidyr - cross/replace_na
library(dplyr)
library(tidyr)
DF %>%
mutate(across(where(is.numeric), ~ replace_na(., median(., na.rm = TRUE))))
3) 动物园 - na.aggregate
library(zoo)
ok <- sapply(DF, is.numeric)
replace(DF, ok, na.aggregate(DF[ok], FUN = median))
4) 基础R
na.median <- function(x) replace(x, is.na(x), median(x, na.rm = TRUE))
ok <- sapply(DF, is.numeric)
replace(DF, ok, lapply(DF[ok], na.median))
5) 基础 R - S3
na.median <- function(x, ...) UseMethod("na.median")
na.median.default <- identity
na.median.numeric <- function(x, ...) {
replace(x, is.na(x), median(x, na.rm = TRUE))
}
replace(DF, TRUE, lapply(DF, na.median))
6) magrittr 我们首先复制DF 以避免破坏它——虽然不建议你可以在最后一行使用DF,如果你可以覆盖它——并使用 magrittr %<>%。 na.median 来自 (4)。
library(magrittr)
DF2 <- DF
DF2[sapply(DF2, is.numeric)] %<>% lapply(na.median)
7) collapse - ftmv ftmv 或其同义词 ftransformv 提供了一个紧凑的表达式。这使用na.median 来自(4)。
library(collapse)
tfmv(DF, is.numeric, na.median)