r语言 - 将类因子列中的 NA 转换为 0

  • 本文关键字:NA 转换 r语言 r rstudio
  • 更新时间 :
  • 英文 :


我有一列类型因子。列中的某些值是 NA 值。如何将所有这些 NA 值转换为新级别,例如 0 或"原始 NA"或其他内容。

我能够将类数字列的 NA 转换为 0,但无法为类因子列执行此操作。

我的数据

> col1 = c(1,2,3,4,NA)
> col2 = c(6,7,NA,NA,8)
> df = data.frame(col1,col2)
> df
  col1 col2
1    1    6
2    2    7
3    3   NA
4    4   NA
5   NA    8
> df$col2 = as.factor(df$col2)
> class(df$col1)
[1] "numeric"
> class(df$col2)
[1] "factor"

尝试将 NA 值转换为另一个级别,例如 0

> df[is.na(df)] = 0
Warning message:
In `[<-.factor`(`*tmp*`, thisvar, value = 0) :
  invalid factor level, NA generated
> df
  col1 col2
1    1    6
2    2    7
3    3 <NA>
4    4 <NA>
5    0    8
> levels(df$col2)
[1] "6" "7" "8"

我是否必须将因子列转换为数字,将NA值更改为0,然后在转换后将其转换回因子,如下所示。有没有更好的方法?

> df$col2 = as.numeric(df$col2)
> df
  col1 col2
1    1    1
2    2    2
3    3   NA
4    4   NA
5    0    3
> df[is.na(df)] = 0
> df
  col1 col2
1    1    1
2    2    2
3    3    0
4    4    0
5    0    3
> df$col2 = as.factor(df$col2)
> df
  col1 col2
1    1    1
2    2    2
3    3    0
4    4    0
5    0    3

如果你使用

df$col2 <- addNA(df$col2)

您将获得该因子的新级别"NA"。

警告 :

Warning message:
In `[<-.factor`(`*tmp*`, thisvar, value = 0) :
  invalid factor level, NA generated

意味着您尝试分配一个因子列,其值在他的水平中不存在。您应该首先添加缺失级别,然后再分配它,就像您尝试使用 df[is.na(df)] <- 0 一样。

这里有一个辅助函数,您可以对 data.frame 中的任何因子列执行此操作:

re_levels <- 
  function(col) {
    if (is.factor(col))  levels(col) <- c(levels(col), "0")
  col
  }

然后,将其应用于 data.frame 并将缺失级别更改 0 :

df <- sapply(df,re_levels)
df[is.na(df)] <-  0
#       col1 col2
# [1,]    1    1
# [2,]    2    2
# [3,]    3    0
# [4,]    4    0
# [5,]    0    3

最新更新