R:read.csv / read.tableで型と列名を指定して読み込む。

  • 28
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

read.csvとかread.tableはオプションなしで使うとデータ型を勝手に判別してくれますが、それだと都合が悪い場合があります。業務系のコードで数値解釈可能な0始まりな文字列とかね。

そんな時は明示的に型を指定して読み込むオプションがあります。通常の読み込みよりも速度があがる場合もあります。特にfactorになってしまうようなもの。これは別のオプションでも回避可能ですけど。

test.csvがこんなだとします。

"文字1-1", "001",1,2,3,"文字1-2"
"文字2-1", "101",3,2,1,"文字2-2"

まずは単純に読み込んだ場合。

> # 単純に読み込んだ場合。
> data <- read.csv('test.csv', header=F, encoding="UTF-8")
> sapply(data, class)
       V1        V2        V3        V4        V5        V6 
 "factor" "integer" "integer" "integer" "integer"  "factor" 

2列目が文字列解釈、1、6列目がfactor型として解釈されます。
header=Fは1行目をヘッダーと見なすかどうか、encodingはファイルのエンコーディング指定です。
ヘッダーがないので、名前が勝手に付与されます。

文字列がfactorに解釈されないようにするオプションを付けた場合。

> # 文字列をfactorにしないオプション付き。
> data <- read.csv('test.csv', header=F, encoding="UTF-8", stringsAsFactors=F)
> sapply(data, class)
         V1          V2          V3          V4          V5          V6 
"character"   "integer"   "integer"   "integer"   "integer" "character" 

stringsAsFactorsオプションを使います。

型を明示して読み込んだ場合。ついでに列名も指定してみます。

> data <- read.csv('test.csv', colClasses=c("character", "character", rep("numeric",3), "character"), header=F, col.names=c("c1", "c2", "c3", "c4", "c5", "c6"), encoding="UTF-8")
> sapply(data, class)
         c1          c2          c3          c4          c5          c6 
"character" "character"   "numeric"   "numeric"   "numeric" "character" 

colClassesで型を指定します。同じ型が連続する場合は、rep("numeric",3)のように指定することも。
colClasses="character"で、全ての項目を文字列として読み込むようなことも可能です。
colClassesで指定した数よりデータの列数が多い場合、指定されていない分は勝手に解釈されます。

また、col.namesで列名を指定できます。