我有一個「字典」表是這樣的:做這個連接/合併的「數據表」方式是什麼?
dict <- data.table(
Nickname = c("Abby", "Ben", "Chris", "Dan", "Ed"),
Name = c("Abigail", "Benjamin", "Christopher", "Daniel", "Edward")
)
dict
# Nickname Name
# 1: Abby Abigail
# 2: Ben Benjamin
# 3: Chris Christopher
# 4: Dan Daniel
# 5: Ed Edward
和一個「數據」表是這樣的:
dat <- data.table(
Friend1 = c("Abby", "Ben", "Ben", "Chris"),
Friend2 = c("Ben", "Ed", NA, "Ed"),
Friend3 = c("Ed", NA, NA, "Dan"),
Friend4 = c("Dan", NA, NA, NA)
)
dat
# Friend1 Friend2 Friend3 Friend4
# 1: Abby Ben Ed Dan
# 2: Ben Ed NA NA
# 3: Ben NA NA NA
# 4: Chris Ed Dan NA
我想產生一個data.table
看起來像這樣
result <- data.table(
Friend1.Nickname = c("Abby", "Ben", "Ben", "Chris"),
Friend1.Name = c("Abigail", "Benjamin", "Benjamin", "Christopher"),
Friend2.Nickname = c("Ben", "Ed", NA, "Ed"),
Friend2.Name = c("Benjamin", "Edward", NA, "Edward"),
Friend3.Nickname = c("Ed", NA, NA, "Dan"),
Friend3.Name = c("Edward", NA, NA, "Daniel"),
Friend4.Nickname = c("Dan", NA, NA, NA),
Friend4.Name = c("Daniel", NA, NA, NA)
)
result
# sorry, word wrapping makes this too annoying to copy
這就是我想到的解決方案:
friend_vars <- paste0("Friend", 1:4)
friend_nicks <- paste0(friend_vars, ".Nickname")
friend_names <- paste0(friend_vars, ".Name")
setnames(dat, friend_vars, friend_nicks)
for (i in 1:4) {
dat[, friend_names[i] := dict$Name[match(dat[[friend_nicks[i]]], dict$Nickname)], with = FALSE]
}
有沒有更「數據表式」的方式來做到這一點?我確信它很好,很高效,但是閱讀起來很難看,部分來自data.table
的內部任務,我不覺得我正在充分利用這個軟件包的優勢。
我也不是一個非常強大的SQL用戶,我不太習慣加入術語。我有一種感覺,Data.table - left outer join on multiple tables可能在這裏有用,但我不知道如何將它應用於我的情況。
我爲此升級到了1.9.5,我很高興我做到了。 'on ='語法很棒!順便說一句,如果你事先知道你將要從寬格式轉換到長格式,一般來說,融合第一,融化第二,還是先融化再融合,效率會更高? – shadowtalker
太棒了!我的猜測是融化+加入會更快(因爲你只需要加入一次)。並且熔化通常是在速度方面廉價的操作(如果正確實施)。 – Arun
另請參見:其中是否記錄了'i。*'語法?我無法在'[.data.table'或':=' – shadowtalker