2016-04-08 36 views
0

有一些非常基本的,我在這裏失蹤其值從另一個因素

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 
+0

謝謝@rawr迴應我的問題。我試着用谷歌搜索「無效因素水平,NA生成」,但我真的不明白髮生了什麼。也許我應該去睡覺。 –

+0

@ HaddE.Nuff,謝謝。這非常有幫助! –

回答

4

記住因素背後的原始設計原理總是有幫助的。它們是用於分類變量的,它們採用固定的一組值。所以,想象我改變你的榜樣略是:

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值,因爲他們不是活得噸因素了。

+0

謝謝喬蘭,因爲我沒有生成我的數據,但得到它'因素'我想知道是否有辦法_simply_所有'因素'轉換爲'chr'?另外,是否有一種廣義的方式來使用teh級別的組合,我從g1中獲取級別?這不僅是我實際數據中的兩個級別。這只是一個簡單的工作示例。謝謝! –

+0

我剛剛意識到,我上面的評論的第一部分回答了[@ HaddE.Nuff的評論我的最初問題](http://stackoverflow.com/questions/36508897/replace-nas-on-one-factor-with - 值從 - 另一個因子?noredirect = 1#comment60624915_36508897)。 –

+0

@EricFail有很多方法。這裏有一個:'is_f < - sapply(d,is.factor); d [is_f] < - lapply(d [is_f],as.character)' – joran

相關問題