更新聯接中的值
當資料 整潔時, 它通常被組織成幾個表。要合併資料進行分析,我們需要使用另一個表中的值更新一個表。
例如,我們可能有演出的銷售資料,其中表演者的屬性(他們的預算)和位置(人口)儲存在不同的表中:
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
上工作。
使用單獨表的優點
關於整潔資料的論文中介紹了這種結構的優點,但在此背景下:
-
*追蹤丟失的資料。*只有在合併中匹配的行才會收到分配。我們上面沒有關於
geo_id == "MO"
的資料,因此我們的最終表格中的變數是NA
。如果我們意外地看到這樣的缺失資料,我們可以追溯到geoDT
表中缺少的觀察,並從那裡調查我們是否有可以解決的資料問題。 -
*可理解性。*在建立我們的統計模型時,記住
budget
對每個表演者來說都是不變的可能是很重要的。一般而言,瞭解資料結構會帶來好處。 -
*記憶體大小。*可能存在大量的執行者和位置屬性,這些屬性不會在統計模型中結束。這樣,我們不需要將它們包含在用於分析的(可能是大量的)表中。
以程式設計方式確定列
如果 pDT
中有很多列,但我們只想選幾個,我們可以使用
p_cols = "budget"
DT[pDT, on=.(p_id = id), (p_cols) := mget(sprintf("i.%s", p_cols))]