如何用 R 中因子中的另一个值替换 NA 值?

数据挖掘 r 缺失数据
2021-09-17 08:27:30

我的数据框中有一个因子变量,其值在原始 CSV 中“NA”的意思是简单的“无”,而不是丢失数据。因此,我想用“无”因子值替换给定列中的每个值。我试过这个:

DF$col[is.na(DF$col)] <- "None"

但这会引发以下错误:

Warning message:
In `[<-.factor`(`*tmp*`, is.na(DF$col), value = c(NA, NA,  :
  invalid factor level, NA generated

我猜这是因为最初列中没有“无”因子级别,但这是真正的原因吗?如果是这样,我怎么能在因子中添加一个新的“无”级别?

(如果您问我为什么不在该read.csv阶段将 NA 转换为“无”:在其他列中,NA 确实意味着丢失数据)。

4个回答

您可以使用此功能:

forcats::fct_explicit_na

library(forcats) 
fct_explicit_na(DF$col, na_level = "None")

用法

它可以在 mutate 函数中使用并通过管道直接编辑 DF:

library(tidyverse) # for tidy data packages, automatically loads dplyr
library(magrittr) # for piping
DF %<>% mutate(cols = fct_explicit_na(col, na_level = "None"))

请注意,“col”需要成为此工作的一个因素。

您需要将“无”添加到因子级别并重构列 DF$col。我使用 iris 数据集添加了一个示例脚本。

df <- iris

# set 20 Species to NA
set.seed(1234)
s <- sample(nrow(df), 20)
df$Species[s] <- NA

# Get levels and add "None"
levels <- levels(df$Species)
levels[length(levels) + 1] <- "None"

# refactor Species to include "None" as a factor level
# and replace NA with "None"
df$Species <- factor(df$Species, levels = levels)
df$Species[is.na(df$Species)] <- "None"

您最初的方法是正确的,您对缺失级别的直觉也是正确的。要执行您想要的操作,您只需添加“无”级别。

#Create a factor for the example
x<-factor(c("S",NA,"M","S","S","S",NA,NA,"S","M","S",NA,"M","S",NA,"S","S",NA,"M","S",NA,"M"))

levels(x)<-c(levels(x),"None")  #Add the extra level to your factor
x[is.na(x)] <- "None"           #Change NA to "None"

我只是做一个 NA 分配

library(roperators)

vec <- c('1', '2', NA, '4')
vec <- chr(vec) # make it a character vector first

vec %na<-% 0

print(vec)

如果您真的需要(例如用于绘图),请再次将其变成一个因素。或者您可以先添加因子级别(如上所述)并覆盖 NA