用因子水平替换一系列变量中的 NA

Replace NA in a series of variables by a factor level

这是我的数据,我想把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 

如果这些因素已经存在,你可以使用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  

在基础 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