替换因子列中的 <NA>

标签 r dataframe replace na

我想替换<NA>因子列中的值具有有效值。但我找不到办法。该示例仅用于演示。原始数据来 self 必须处理的国外csv文件。

df <- data.frame(a=sample(0:10, size=10, replace=TRUE),
                 b=sample(20:30, size=10, replace=TRUE))
df[df$a==0,'a'] <- NA
df$a <- as.factor(df$a)

可能看起来像这样

      a  b
1     1 29
2     2 23
3     3 23
4     3 22
5     4 28
6  <NA> 24
7     2 21
8     4 25
9  <NA> 29
10    3 24

现在我想替换 <NA>带数字的值。

df[is.na(df$a), 'a'] <- 88
In `[<-.factor`(`*tmp*`, iseq, value = c(88, 88)) :
  invalid factor level, NA generated

我想我错过了关于因子的基本 R 概念。我是吗? 我不明白为什么它不起作用。我认为invalid factor level意味着88该因素不是有效水平,对吧?所以我必须告诉因子列还有另一个级别?

最佳答案

1) addNA 如果 fac 是一个因子,addNA(fac) 是相同的因子,但添加了 NA 作为级别。请参阅?addNA

强制 NA 级别为 88:

facna <- addNA(fac)
levels(facna) <- c(levels(fac), 88)

给予:

> facna
 [1] 1  2  3  3  4  88 2  4  88 3 
Levels: 1 2 3 4 88

1a) 这可以写成一行,如下所示:

`levels<-`(addNA(fac), c(levels(fac), 88))

2)因子也可以使用factor的各种参数在一行中完成,如下所示:

factor(fac, levels = levels(addNA(fac)), labels = c(levels(fac), 88), exclude = NULL)

2a) 或同等内容:

factor(fac, levels = c(levels(fac), NA), labels = c(levels(fac), 88), exclude = NULL)

3) ifelse 另一种方法是:

factor(ifelse(is.na(fac), 88, paste(fac)), levels = c(levels(fac), 88))

4) forcats forcats 包有一个函数:

library(forcats)

fct_na_value_to_level(fac, "88")
## [1] 1  2  3  3  4  88 2  4  88 3 
## Levels: 1 2 3 4 88

注意:我们使用以下内容作为输入fac

fac <- structure(c(1L, 2L, 3L, 3L, 4L, NA, 2L, 4L, NA, 3L), .Label = c("1", 
"2", "3", "4"), class = "factor")

更新:改进了 (1) 并添加了 (1a)。后来添加了(4)。

关于替换因子列中的 <NA>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39126537/

相关文章:

javascript - 用于替换单个反斜杠的正则表达式,不包括后跟某些字符的反斜杠

在 R 中复制矩阵的行

dataframe - Julia数据框直接访问行

python - 如何从 pandas 数据框中的特定列写入多个 Excel 工作表?

r - 如何用 R 中字符串列表中的值替换数据帧列表的行名?

python - 使用基于条件的字典替换 python 数据框中的列值

variables - 引用-替换和变量

r - 无法将XML元素与R中的XPath匹配

r - 如何将 openstreetmap 与 R 中的点结合起来

R 中变量随时间序列的超出次数的滚动计数