用另一个因素的值替换一个因素的 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
值,因为它们不再是因子了。
这里缺少一些非常基本的东西
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
值,因为它们不再是因子了。