2016-04-08 11 views
0

からの値を一つの要因でNASを置き換えるあり、何か非常に基本的な私がここで行方不明ですは別の要因

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

私の質問にお答えいただき、ありがとうございました。グーグルで「無効な要素レベル、NAが生成されました。」と試みましたが、何が起きているのか正直には分かりませんでした。多分私は寝るべきです。 –

+0

@ HaddE.Nuff、ありがとう。それは非常に便利です! –

答えて

4

要因の背後にある元の設計の根拠を覚えておくことは常に役立ちます。それらは、固定値のセットの1つを取ったカテゴリ変数のためのものでした。だから私はあることを少しあなたの例を変更想像:なぜ私たちが今まで「高」のcolorをしたいと思うので

> 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 

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は文句という理にかなっていますまたは "ミッド"?それは意味をなさない。ここでの精神的モデルは、2つの要素が実際には互いに関係しないか、そうであればレベルが同じでなければならないということです。だから、

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

私は自分のデータを生成していないので、ジョランに感謝しますが、「要因」でそれを取得します。すべての「要因」を「単純に」変換する方法があるかどうか疑問に思いましたか?また、私はg1からレベルをつかむレベルの組み合わせを使用する一般的な方法はありますか?私の実際のデータには2つのレベルだけではありません。これは単純な実例です。ありがとう! –

+0

私は、上記の私のコメントの最初の部分は[@ HaddE.Nuffの私の最初の質問へのコメント]によって答えられていることに気付きました(http://stackoverflow.com/questions/36508897/replace-nas-on-one-factor-with他の要素からの値?noredirect = 1#comment60624915_36508897)。 –

+0

@EricFail方法はたくさんあります。ここに1つがあります: 'is_f < - sapply(d、is.factor); d [is_f] < - lapply(d [is_f]、as.character) ' – joran

関連する問題