KuboWeb top

更新: 2018-01-16 12:26:08

生態学のデータ解析 - FAQ R の factor クラス


[項目]


read.csv() で CSV ファイルを読みこんだら数値データの列が numeric にならずに factor になるのはなぜですか? 

  • その列に数字ではない文字が含まれているからです
    • 例: アルファベットや日本語の文字,カッコなどの記号
  • 例: test.csv ファイルにデータが入っている場合の例です
  • また (いわゆる) 「全角文字」もダメです
    • たとえば 1.23 のつもりで 1.23 と入力すると,これは「数値ではない文字」と認識されます
  • ようするに -.0123456789e 以外の文字があると factor として読まれるでしょう
    • 1.23e+2 といった指数表示も OK です
  • また「何も入力されてないセル」があっても OK です
    • NA つまり欠測として読みこまれます
    • 空白文字 (スペイス) が入っていても NA になります
> (d <- read.csv("test.csv")) # 読みこみ
  i       x
1 1    1.23
2 2    2.34
3 3     aaa
4 4 4.56e+9
5 5    5.67

> d$x # x 列は水準 (levels) をもつ factor クラス
[1] 1.23    2.34    aaa     4.56e+9 5.67
Levels: 1.23 2.34 4.56e+9 5.67 aaa

> class(d$x) # factor クラスとして認識される
[1] "factor"

factor として読みこまれた列を numeric にするにはどうしたらいいんでしょうか? 

  • 上の質問のように test.csv を読んだ場合だと,d$x <- as.numeric(as.character(d$X)) で OK です
> as.numeric(as.character(d$x)) 
[1] 1.23e+00 2.34e+00       NA 4.56e+09 5.67e+00
Warning message:
 強制変換により NA が生成されました

数値でない文字が混入した行をさがすにはどうしたらいいでしょうか? 

  • 次の例のように grep() を使うのがよいでしょう
    • この例では 3 行目に数値でない文字が入っていることがわかります (問題のある行が複数ある場合はすべてそれらの行数を列挙します)
> grep(TRUE, is.na(as.numeric(as.character(d$x))))
[1] 3
Warning message:
In grep(TRUE, is.na(as.numeric(as.character(d$x)))) :
   強制変換により NA が生成されました