記住因素背後的原始設計原理總是有幫助的。它們是用於分類變量的,它們採用固定的一組值。所以,想象我改變你的榜樣略是:
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
,因爲爲什麼我們曾經想要的「高」一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
值,因爲他們不是活得噸因素了。
謝謝@rawr迴應我的問題。我試着用谷歌搜索「無效因素水平,NA生成」,但我真的不明白髮生了什麼。也許我應該去睡覺。 –
@ HaddE.Nuff,謝謝。這非常有幫助! –