サーチ…


前書き

結合は、関連する列を含む2つの表を結合します。この用語は、基本的には2つのテーブル追加する以外のすべての操作をカバーします。 「マージ」は同義語です。公式ドキュメントの場合は?`[.data.table`と入力して?`[.data.table`

構文

  • x [i、on、j]
    #join:data.table x&data.tableまたはlist i
  • x [!i、on、j]
    #anti-join

備考

キー付きテーブルの操作

xiキーを持っていたり、 xiの最初の数列と一致するようにキーが設定されていれば、 onx[i]ようにスキップできます。

共通の列名の曖昧さを解消する

jx[i, on, j] 、列i用いて参照することができるi.*プレフィックス。

サブセットのグループ化

jx[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直接作業することもできます。

別のテーブルを使用する利点

この構造の利点は、整頓されたデータのペーパーでカバーされますが、この文脈では:

  1. 欠落しているデータをトレースします。マージで一致する行のみが割り当てを受け取ります。上記のgeo_id == "MO"のデータはないので、その変数は最終テーブルではNAです。このような欠落したデータが予期せずにgeoDTと、 geoDTテーブルの欠落したデータを追跡し、そこからデータ問題があるかどうかを調べることができます。

  2. 理解度。私たちの統計モデルを構築する際には、各パフォーマーにとってbudgetは一定であることを覚えておくことが重要です。一般に、データの構造を理解することは配当を支払う。

  3. メモリー容量。パフォーマーと位置属性の数が統計モデルで終わらない場合があります。このようにして、分析に使用される(おそらく大量の)テーブルにそれらを含める必要はありません。

プログラムで列を決定する

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.122.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各行の一致数をカウントするには、 .Nby=.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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow