data.table
結合とマージ
サーチ…
前書き
?`[.data.table`
と入力して?`[.data.table`
。
構文
- x [i、on、j]
#join:data.table x&data.tableまたはlist i - x [!i、on、j]
#anti-join
備考
キー付きテーブルの操作
x
とi
がキーを持っていたり、 x
がi
の最初の数列と一致するようにキーが設定されていれば、 on
はx[i]
ようにスキップできます。
共通の列名の曖昧さを解消する
でj
のx[i, on, j]
、列i
用いて参照することができるi.*
プレフィックス。
サブセットのグループ化
でj
のx[i, on, j, by=.EACHI]
、 j
各行について計算されるi
。
これが唯一の値であるby
使用する価値。他の値の場合、 i
列は使用できません。
結合の値を更新する
データが「整頓」されている場合、それはしばしば複数のテーブルに編成されます。分析のためにデータを結合するには、あるテーブルを別のテーブルの値で「更新」する必要があります。
たとえば、パフォーマーの属性(予算)とロケーション(母集団)の属性が別々の表に格納されている、パフォーマンスの売上データがあるとします。
set.seed(1)
mainDT = data.table(
p_id = rep(LETTERS[1:2], c(2,4)),
geo_id = sample(rep(state.abb[c(1,25,50)], 3:1)),
sales = sample(100, 6)
)
pDT = data.table(id = LETTERS[1:2], budget = c(60, 75))
geoDT = data.table(id = state.abb[c(1,50)], pop = c(100, 200))
mainDT # sales data
# p_id geo_id sales
# 1: A AL 95
# 2: A WY 66
# 3: B AL 62
# 4: B MO 6
# 5: B AL 20
# 6: B MO 17
pDT # performer attributes
# id budget
# 1: A 60
# 2: B 75
geoDT # location attributes
# id pop
# 1: AL 100
# 2: WY 200
いくつかの分析を行う準備ができたら、次の表から変数を取得する必要があります。
DT = copy(mainDT)
DT[pDT, on=.(p_id = id), budget := i.budget]
DT[geoDT, on=.(geo_id = id), pop := i.pop]
# p_id geo_id sales budget pop
# 1: A AL 95 60 100
# 2: A WY 66 60 200
# 3: B AL 62 75 100
# 4: B MO 6 75 NA
# 5: B AL 20 75 100
# 6: B MO 17 75 NA
生データの汚染を避けるためにcopy
を取っていcopy
が、代わりにmainDT
直接作業することもできます。
別のテーブルを使用する利点
この構造の利点は、整頓されたデータのペーパーでカバーされますが、この文脈では:
欠落しているデータをトレースします。マージで一致する行のみが割り当てを受け取ります。上記の
geo_id == "MO"
のデータはないので、その変数は最終テーブルではNA
です。このような欠落したデータが予期せずにgeoDT
と、geoDT
テーブルの欠落したデータを追跡し、そこからデータ問題があるかどうかを調べることができます。理解度。私たちの統計モデルを構築する際には、各パフォーマーにとって
budget
は一定であることを覚えておくことが重要です。一般に、データの構造を理解することは配当を支払う。メモリー容量。パフォーマーと位置属性の数が統計モデルで終わらない場合があります。このようにして、分析に使用される(おそらく大量の)テーブルにそれらを含める必要はありません。
プログラムで列を決定する
pDT
に列がたくさんあるが、いくつかを選択したいだけの場合は、
p_cols = "budget"
DT[pDT, on=.(p_id = id), (p_cols) := mget(sprintf("i.%s", p_cols))]
(p_cols) :=
前後の括弧は必須であり、 列の作成に関する文書に記載されています 。
等結合
# example data
a = data.table(id = c(1L, 1L, 2L, 3L, NA_integer_), x = 11:15)
# id x
# 1: 1 11
# 2: 1 12
# 3: 2 13
# 4: 3 14
# 5: NA 15
b = data.table(id = 1:2, y = -(1:2))
# id y
# 1: 1 -1
# 2: 2 -2
直感
x[i]
は、 i
各行x
部分集合を選択すると考える。この構文は、基底Rの行列サブセットを反映し、 DT[where, select|update|do, by]
意味する最初の引数と一致しDT[where, select|update|do, by]
。
merge(x,i)
まだdata.tablesで動作するので、この新しい構文が学ぶ価値があるのか疑問に思うかもしれません。簡単な答えは、通常はマージしてさらに何かをしたいということです。 x[i]
構文は、この使用パターンを簡潔にキャプチャし、より効率的な計算も可能にします。より詳しい説明は、FAQ 1.12と2.14を読んでください。
複数の一致した行の処理
デフォルトでは、のすべての列マッチングの各列a
b
返されます。
a[b, on="id"]
# id x y
# 1: 1 11 -1
# 2: 1 12 -1
# 3: 2 13 -2
これはmult
で微調整できます:
a[b, on="id", mult="first"]
# id x y
# 1: 1 11 -1
# 2: 2 13 -2
不一致行の処理
デフォルトでは、比類のない行はまだ結果に表示します: a
b[a, on="id"]
# id y x
# 1: 1 -1 11
# 2: 1 -1 12
# 3: 2 -2 13
# 4: 3 NA 14
# 5: NA NA 15
これらを非表示にするには、 nomatch
使用しnomatch
。
b[a, on="id", nomatch=0]
# id y x
# 1: 1 -1 11
# 2: 1 -1 12
# 3: 2 -2 13
x[i]
はi
内のNAとの一致を試みます。
カウントされたマッチを返しました
i
各行の一致数をカウントするには、 .N
とby=.EACHI
使用します。
b[a, on="id", .N, by=.EACHI]
# id N
# 1: 1 1
# 2: 1 1
# 3: 2 1
# 4: 3 0
# 5: NA 0