更新聯接中的值

當資料 整潔時, 它通常被組織成幾個表。要合併資料進行分析,我們需要使用另一個表中的值更新一個表。

例如,我們可能有演出的銷售資料,其中表演者的屬性(他們的預算)和位置(人口)儲存在不同的表中:

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 是為了避免汙染原始資料,但我們可以直接在 mainDT 上工作。

使用單獨表的優點

關於整潔資料的論文中介紹了這種結構的優點,但在此背景下:

  1. *追蹤丟失的資料。*只有在合併中匹配的行才會收到分配。我們上面沒有關於 geo_id == "MO" 的資料,因此我們的最終表格中的變數是 NA。如果我們意外地看到這樣的缺失資料,我們可以追溯到 geoDT 表中缺少的觀察,並從那裡調查我們是否有可以解決的資料問題。

  2. *可理解性。*在建立我們的統計模型時,記住 budget 對每個表演者來說都是不變的可能是很重要的。一般而言,瞭解資料結構會帶來好處。

  3. *記憶體大小。*可能存在大量的執行者和位置屬性,這些屬性不會在統計模型中結束。這樣,我們不需要將它們包含在用於分析的(可能是大量的)表中。

以程式設計方式確定列

如果 pDT 中有很多列,但我們只想選幾個,我們可以使用

p_cols = "budget"
DT[pDT, on=.(p_id = id), (p_cols) := mget(sprintf("i.%s", p_cols))]

建立列的文件所述(p_cols) := 周圍的括號是必不可少的。