hack のためのネタ帳, etc,,,

状況と解決方法

f, n が data.frame だった場合にこれを1つにまとめようとして
rbind(f, n)
みたいなことをした場合に
Warning message:
In `[<-.factor`(`*tmp*`, ri, value = c(5L, 5L, 7L, 7L, 1L, 1L, 1L,  :
   不正な因子水準です。NA が発生しました 
みたいな警告が出る事がある。
でかいデータ結合したので、どこに問題が発生したのかさっぱり分からずしばらく途方に暮れてしまった。

ググってみたところ
どうもこれは、数値型に文字型(factor)を rbind() するのは問題ないが、
逆に、文字型(factor)に数値型を rbind() した場合に、それが出来ず当該の数値型データが NA として扱われるため、この警告が発生するらしい。
例えば以下のようなケース。
n=data.frame(x=c(1,2))
f=data.frame(x=c("alpha","bravo"))
rbind(n,f)
rbind(f,n)
> n=data.frame(x=c(1,2))
> f=data.frame(x=c("alpha","bravo"))
> rbind(n,f)
      x
1     1
2     2
3 alpha
4 bravo
> rbind(f,n)
      x
1 alpha
2 bravo
3  <NA>
4  <NA>
Warning message:
In `[<-.factor`(`*tmp*`, ri, value = c(1, 2)) :
   不正な因子水準です。NA が発生しました 
つまり因子水準でデータ保持してる factor に数値を放り込むなという事らしい。

対処方法としては、追加する方のデータを sapply() で as.character に通すことで、数値を factor 化してから rbind () せよとの事。
具体的には以下のようにすれば良いらしい。
rbind(f,sapply(n,as.character))
> rbind(f,sapply(n,as.character))
      x
1 alpha
2 bravo
3     1
4     2

参考:

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

編集にはIDが必要です