更新: 2018-01-16 12:26:08
生態学のデータ解析 - FAQ R の factor クラス
- ここでは R の
factor
クラス (因子クラス) に関する FAQ です - 参照: R-primer/R 基本データクラス, FAQ 系ペイジ一覧
[項目]
- read.csv() で CSV ファイルを読みこんだら数値データの列が numeric にならずに factor になるのはなぜですか?
- factor として読みこまれた列を numeric にするにはどうしたらいいんでしょうか?
- 数値でない文字が混入した行をさがすにはどうしたらいいでしょうか?
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 が生成されました