💽

R で大きな固定長ファイルをインポートする

2024/01/24に公開

記事の内容

この記事では、R を使って大きなサイズの固定長ファイルをインポートする方法を紹介します。

固定長ファイルとは

IT 用語辞典には以下のように記載されています。

固定長(fixed length)とは、データや要素、領域などの長さ(データ量)や個数があらかじめ決まっていて変化しないこと。対義語は「可変長」(variable length)。

例えばある固定長ファイルに 0001085 という値が保存されており、左から 4 番目までの 0001 は個人 ID を指し、5~7 番目の 085 は個人のスコアを指す、といったケースがあります。

固定長ファイルを分析用のデータフレームとしてインポートするためには、データのどの位置が何の変数を指しているかを明示する必要があります。ファイルのサイズが大きく変数も多い場合は大変手間がかかりますが、気合いで乗り越えるしかありません。

サンプルデータの確認

以下を実行し、サンプルデータを取得します。

fwf_sample <- readr_example("fwf-sample.txt")

サンプルデータはこうなっています。

> read_lines(fwf_sample)
[1] "John Smith          WA        418-Y11-4111" "Mary Hartford       CA        319-Z19-4341"
[3] "Evan Nolan          IL        219-532-c301"

データをインポートする

{readr} パッケージの read_fwf を使います。様々なオプションがあるので、具体的な使い方はこちらをご確認いただければと思います。ここでは大きなファイルをインポートすることを想定したコードを残します。なお例として、rest 列の型を因子型に指定しています。

read_fwf(file = fwf_sample, 
         col_positions = fwf_cols(name = c(1, 20), 
                                  rest = c(21, 29),
                                  ssn = c(30, 42)),
         col_types = cols(rest = col_factor())
         )

具体的には file で対象のファイルを、col_positions で列名と各変数の始点と終点を指定しています。結果は以下のようになります。

# A tibble: 3 × 3
  name          rest  ssn         
  <chr>         <fct> <chr>       
1 John Smith    WA    418-Y11-4111
2 Mary Hartford CA    319-Z19-4341
3 Evan Nolan    IL    219-532-c301

まとめ

大きな固定長ファイルのインポートを行うには、列名や変数の位置をミスのないように指定する必要があり、手間もかかります。Stata では infix コマンドで同様の操作が可能です。もしかしたらそちらについても書くかもしれません。

GitHubで編集を提案

Discussion