Rのデータハンドリングは利用パッケージに合わせた「データのクラスや構造」に注意が必要です。パッケージヘルプのデータではうまく動くのに、自身で準備したデータでは期待した結果が出力されない。そんな経験はないでしょうか。
そんな場合は、strコマンドで用意したデータの構造を確認後、as.numericやas.integerなどのコマンドでクラスを変更で解決することが多いです。でも、できればデータの準備時に「データの構造やクラスは整えたい」ものです。
データの構造やクラスを整えるパッケージはいくつかありますが、「文字列データからクラスと構造を整える」ちょっと変わった「iotools」パッケージを紹介します。
パッケージのバージョンは0.1-22。R version 3.2.1でコマンドを確認しています。
パッケージのインストール
下記コマンドを実行してください。
#パッケージのインストール
install.packages("iotools")
実行コマンドの紹介
詳細はコメント、パッケージヘルプを確認してください。紹介していませんがread.csv.rawコマンドは使用環境によりRごと落ちるかもしれません。ファイルの読み込みは他パッケージの利用をオススメします。
#パッケージの読み込み
library("iotools")
#文字列から行列を作成:.default.formatterコマンド
#\tで行名とデータを区別,データは|で区切ります
TestData <- c("てすと\tB|3|D", "てすと2\tB|3|B", "てすと\tA|1|E")
.default.formatter(TestData)
[,1] [,2] [,3]
てすと "B" "3" "D"
てすと2 "B" "3" "B"
てすと "A" "1" "E"
#以下matrixコマンドと同じ
matrix(c("B", "B", "A", "3", "3", "1", "D", "B", "E"), nrow = 3, ncol = 3,
dimnames = list(c("てすと", "てすと2", "てすと")))
#データのクラスを指定しデータフレームを作成:dstrsplitコマンド
#データ例の作成
#\tで行名とデータを区別,データは|で区切ります
TestData = c("シャーロット\t5|2.7|友利|0d|1|2015-02-05 20:22:57",
"化物語\t7|3e3|神原|e4|1+3i|2015-02-05",
"だんまち\te|1.8|ヘスティア|77|4.2i|2001-02-05")
#クラスの指定:col_typesオプション
#"character", "numeric", "logical", "integer", "complex", "raw", "POSIXct"が指定可能
TDF <- dstrsplit(x = TestData, sep = "|", nsep = "\t",
col_types = c("integer", "numeric", "character", "raw", "complex", "POSIXct"))
#データ構造の確認
str(TDF)
'data.frame': 3 obs. of 7 variables:
$ rowindex: chr "シャーロット" "化物語" "だんまち"
$ V1 : int 5 7 NA
$ V2 : num 2.7 3000 1.8
$ V3 : chr "友利" "神原" "ヘスティア"
$ V4 : raw 0d e4 77
$ V5 : cplx 1+0i 1+3i 0+4.2i
$ V6 : POSIXct, format: "2015-02-05 20:22:57" "2015-02-05 00:00:00" "2001-02-05 00:00:00"
#tapplyコマンドの高速版:ctapplyコマンド
#並び替えを実行するのがポイントです
#データ例の作成
i = rnorm(4e6)
names(i) = as.integer(rnorm(1e6))
#並び替え
i = i[order(names(i))]
#tapplyコマンド処理速度
system.time(tapply(i, names(i), sum))
ユーザ システム 経過
0.383 0.039 0.422
#ctapplyコマンド処理速度
system.time(ctapply(i, names(i), sum))
ユーザ システム 経過
0.027 0.003 0.031
少しでも、あなたのウェブや実験の解析が楽になりますように!!