【问题标题】:Replace NA in a series of variables by a factor level用因子水平替换一系列变量中的 NA
【发布时间】:2021-03-13 00:56:30
【问题描述】:
这是我的数据,我想将NA 替换为“否”。我可以一一替换缺失值。但是,我需要替换代码中的s_1:s_4 中的NAs。提醒一下,所有变量都是因子水平。
id x s_0 s_1 s_2 s_3
1 5 75 A 4 110
2 9 36 NA NA 921
3 11 13 B 7 769
4 11 34 C 2 912
5 11 NA C NA 835
6 13 39 NA 4 NA
7 14 45 B 4 577
8 19 42 D 6 NA
9 20 4 NA 7 577
10 13 28 NA 3 573
【问题讨论】:
标签:
r
dplyr
datatable
missing-data
imputation
【解决方案1】:
如果这些是已经存在的因素,你可以使用forcats::fct_explicit_na():
library(dplyr)
library(forcats)
# Make sample data vars factors
dat <- dat %>%
mutate(across(starts_with("s_"), as.factor))
# Add 'No' as factor level
dat %>%
mutate(across(starts_with("s_"), fct_explicit_na, "No"))
# A tibble: 10 x 6
id x s_0 s_1 s_2 s_3
<dbl> <dbl> <fct> <fct> <fct> <fct>
1 1 5 75 A 4 110
2 2 9 36 No No 921
3 3 11 13 B 7 769
4 4 11 34 C 2 912
5 5 11 No C No 835
6 6 13 39 No 4 No
7 7 14 45 B 4 577
8 8 19 42 D 6 No
9 9 20 4 No 7 577
10 10 13 28 No 3 573
【解决方案2】:
在基础 R 中,您需要在将 NA 转换为 "No" 之前将 "No" 作为因子水平。
cols <- grep('s_\\d+', names(df))
df[cols] <- lapply(df[cols], function(x) {
levels(x) <- c(levels(x), 'No')
x[is.na(x)] <- 'No'
x
})
df
# id x s_0 s_1 s_2 s_3
#1 1 5 75 A 4 110
#2 2 9 36 No No 921
#3 3 11 13 B 7 769
#4 4 11 34 C 2 912
#5 5 11 No C No 835
#6 6 13 39 No 4 No
#7 7 14 45 B 4 577
#8 8 19 42 D 6 No
#9 9 20 4 No 7 577
#10 10 13 28 No 3 573