Rで解析:文字列データからクラスと構造を整える!「iotools」パッケージ

Rの解析に役に立つ記事

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

少しでも、あなたのウェブや実験の解析が楽になりますように!!

タイトルとURLをコピーしました