用另一个因素的值替换一个因素的 NA

replace NAs on one factor with values from another factor

这里缺少一些非常基本的东西

d <- data.frame(
g0  = c("A", "B", NA, NA, "C", "C"),
g1  = LETTERS[1:6])
d
    g0 g1
1    A  A
2    B  B
3 <NA>  C
4 <NA>  D
5    C  E
6    C  F

我有这个代码,但它不起作用

d$g0[is.na(d$g0)] <- d$g1[is.na(d$g0)]

想要的结果。

d
    g0 g1
1    A  A
2    B  B
3    C  C
4    D  D
5    C  E
6    C  F

记住因素背后的原始设计原理总是有帮助的。它们适用于采用一组固定值中的一个的分类变量。所以想象一下我将您的示例稍微更改为:

d <- data.frame(color  = c("red", "blue", NA, NA, "green", "green"),
                amount  = c("high","low","low","mid","mid","high"))

> d
  color amount
1   red   high
2  blue    low
3  <NA>    low
4  <NA>    mid
5 green    mid
6 green   high

现在当我们 运行 以下内容时 R 抱怨是完全有道理的:

> d$color[is.na(d$color)] <- d$amount[is.na(d$color)]
Warning message:
In `[<-.factor`(`*tmp*`, is.na(d$color), value = c(3L, 1L, NA, NA,  :
  invalid factor level, NA generated

因为为什么我们想要 "high" 或 "mid" 的 color?这是没有意义的。这里的心智模型是,要么两个因素真的彼此无关,要么如果有关系,它们的水平应该相同。所以,

levels(d$color) <- c(levels(d$color),"low","mid")
d$color[is.na(d$color)] <- d$amount[is.na(d$color)]

这个 运行 没问题:

> d
  color amount
1   red   high
2  blue    low
3   low    low
4   mid    mid
5 green    mid
6 green   high

即使结果在语义上毫无意义。

当然,许多人发现所有这些因素级别的杂耍令人厌烦,并且会简单地完成:

d <- data.frame(color  = c("red", "blue", NA, NA, "green", "green"),
                amount  = c("high","low","low","mid","mid","high"), 
                stringsAsFactors = FALSE)

然后 R 根本不在乎你用什么填充 NA 值,因为它们不再是因子了。