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