在 R 数据框中选定的因子列中将 NA 更改为 "N"

Changing NA to "N" in selected factor columns in R data frame

我有以下带有因子列的数据框。

set.seed(1234)
df <- data.frame(a=sample(c("1","2",NA), 10, replace=T),
                b=sample(c("1","2",NA), 10, replace=T), 
                c=sample(c("1","2","3",NA), 10, replace=T))

也就是

df
      a    b    c
1     1 <NA>    2
2     2    2    2
3     2    1    1
4     2 <NA>    1
5  <NA>    1    1
6     2 <NA> <NA>
7     1    1    3
8     1    1 <NA>
9     2    1 <NA>
10    2    1    1

现在,我想为选定的列创建一个新级别 "N",并将这些列中的所有 NA 转换为 "N"。我通过

创建了一个选定列名称的向量
selected <- c("b", "c")

然后尝试按以下方式使用apply

 apply(df, 2, function(x) {(if x %in% selected) x <- factor(x, levels=c(levels(x), 'N'))})

但是报错:

Error: unexpected symbol in "apply(df, 2, function(x) {(if x"

在我的原始数据中,我有很多列。所以我想避免逐列进行。

运算前'selected'列的'levels'为:

 lapply(df[selected], levels)
 #$b
 #[1] "1" "2"

 #$c
 #[1] "1" "2" "3"

我们可以 'loop' 使用 lapply 覆盖 'selected' 中的列,将 'N' 作为每个列中的另一个级别,并且 replace 'NA' 值 'N'.

 df[selected] <- lapply(df[selected], function(x) {
          levels(x) <- c(levels(x), 'N')
           replace(x, which(is.na(x)), 'N')
            })

或者另一个选项是recodecar,我们可以直接把'NA'改成'N'。它会自动更新级别。

 library(car)
 df[selected] <- lapply(df[selected], recode, "NA='N'")
 lapply(df[selected], levels)
 #$b
 #[1] "1" "2" "N"

 #$c
 #[1] "1" "2" "3" "N"

另一个有用的函数是 addNA 如果我们想添加 "NA" 其中一个级别

df[selected] <- lapply(df[selected], addNA)

注意:apply 在非数字列上的输出将是 'character' class。我猜这不是你想要的。