data.table
リスト列を使用してデータを格納する
サーチ…
前書き
Data.tableは、Rの
list
クラスに属する列ベクトルをサポートします。
備考
ケースでは、我々はそれを注意し、コード内でその単語を使用せずにリストの話をしていることを奇妙に見えます.()
の別名であるlist()
内で使用された場合DT[...]
コール。
多くの関連ファイルを読む
同様にフォーマットされた一連のファイルを読み込んでスタックしたいとします。迅速な解決策は次のとおりです。
rbindlist(lapply(list.files(patt="csv$"), fread), id=TRUE)
我々はいくつかの理由でこれに満足しないかもしれません:
- 一貫性のないバグのあるデータフォーマットのため、
fread
読み込むときやrbindlist
スタックするときにエラーになることがあります。 - ファイル名から取得した、または(おそらく表形式ではない)ファイル内のいくつかのヘッダー行から、各ファイルのメタデータを追跡したい場合があります。
これを処理する1つの方法は、 "ファイルテーブル"を作成して、各ファイルの内容をそれに関連する行のリスト列エントリとして格納することです。
データの例
下のサンプルデータを作成する前に、あなたが書き込める空のフォルダにいることを確認してください。 getwd()
を実行し、フォルダを変更する必要がある場合は?setwd
を読み込みます。
# example data
set.seed(1)
for (i in 1:3)
fwrite(data.table(id = 1:2, v = sample(letters, 2)), file = sprintf("file201%s.csv", i))
ファイルとファイルのメタデータを特定する
この部分はかなり簡単です。
# First, identify the files you want:
fileDT = data.table(fn = list.files(pattern="csv$"))
# Next, optionally parse the names for metadata using regex:
fileDT[, year := type.convert(sub(".*([0-9]{4}).*", "\\1", fn))]
# Finally construct a string file-ID column:
fileDT[, id := as.character(.I)]
# fn year id
# 1: file2011.csv 2011 1
# 2: file2012.csv 2012 2
# 3: file2013.csv 2013 3
ファイルを読み込む
リストの列としてファイルを読み込みます。
fileDT[, contents := .(lapply(fn, fread))]
# fn year id contents
# 1: file2011.csv 2011 1 <data.table>
# 2: file2012.csv 2012 2 <data.table>
# 3: file2013.csv 2013 3 <data.table>
ファイルの1つを読み込むのに不具合がある場合、またはファイルの属性に応じて引数をfread
に変更する必要がある場合、この手順は次のように簡単に拡張できます。
fileDT[, contents := {
cat(fn, "\n")
dat = if (year %in% 2011:2012){
fread(fn, some_args)
} else {
fread(fn)
}
.(.(dat))
}, by=fn]
CSVなどのファイルを読み込むオプションの詳細については、「 ?fread
」を参照してください。
スタックデータ
ここから、データを積み重ねたい:
fileDT[, rbindlist(setNames(contents, id), idcol="file_id")]
# file_id id v
# 1: 1 1 g
# 2: 1 2 j
# 3: 2 1 o
# 4: 2 2 w
# 5: 3 1 f
# 6: 3 2 w
スタッキングで何らかの問題が発生した場合(列名や一致しないクラスなど)、 fileDT
内の個々のテーブルにfileDT
て問題の発生場所を調べることができます。例えば、
fileDT[id == "2", contents[[1]]]
# id v
# 1: 1 o
# 2: 2 w
拡張機能
ファイルが現在の作業ディレクトリにない場合は、
my_dir = "whatever"
fileDT = data.table(fn = list.files(my_dir, pattern="*.csv"))
# and when reading
fileDT[, contents := .(lapply(fn, function(n) fread(file.path(my_dir, n))))]
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow