[英]Data.table join with variable column names
我需要在兩個 data.tables 之間迭代執行連接,其中列名是我從函數輸入的變量。 我一直在使用 data.tables 'on' 功能執行連接,並且由於似乎無法識別變量列名稱而遇到問題。
例如,假設我們有兩個表,Table_1 和 Table_2,如下:
require(data.table)
n <- 20
Table_1 <- data.table(A = seq_len(n) + 1,
B = seq_len(n) + 3,
C = seq_len(n) + 5)
m <- 15
Table_2 <- data.table(D = seq_len(m) + 7,
E = seq_len(m) + 9,
F = seq_len(m) + 12)
我可以輕松地在明確定義列的地方執行連接。 例如
Table_2[Table_1,on = .(F = C),sum(D.na.rm = T)]
但是,我需要做的是在各種列上執行多個匹配,例如:
require(purrr)
pmap(.l = CJ(x = c("D","F"),y = c("A","B")),
.f = function(x,y) Table_2[Table_1,on = .(x = y),sum(C,na.rm = T)])
我收到以下錯誤:
Error in colnamesInt(x, names(on), check_dups = FALSE) :
argument specifying columns specify non existing column(s): cols[1]='x'
我嘗試了各種方法,例如:
這兩種方法都不起作用。 任何幫助將不勝感激,因為必須寫出單獨的連接語句顯然效率極低!
謝謝,菲爾
編輯:
下面建議我應該考慮使用“合並”功能。 理論上,這適用於上面的示例,但是我上面沒有提到我實際上需要使用非對等連接,這意味着,據我所知,我不能使用“合並”。 在我的實際案例中,我需要通過函數將列名映射到等值和非等值連接的組合。
我提供了一個帶有目標輸出的后續示例。 該示例只有兩個 join 語句,但我需要該解決方案足夠靈活以處理多個:
我想要以下表達式:
pmap(.l = list(x1 = "D",x2 = "A",x3 = "E",x4 = "B"),
.f = function(x1,x2,x3,x4) (Table_2[Table_1,on = .(x1 = x2,
x3 > x4),sum(C,na.rm = T)]))
要提供與此相同的輸出:
Table_2[Table_1,on = .(D = A,
E > B),sum(C,na.rm = T)]
即在本例中為 310。
再次感謝,菲爾
我只是想出了如何通過反復試驗來做到這一點:
pmap(.l = list(x1 = "D",x2 = "A",x3 = "E",x4 = "B"),
.f = function(x1,x2,x3,x4) (Table_2[Table_1,on =
c(paste0(x1,"==",x2),paste0(x3,">",x4)),
sum(C,na.rm = T)]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.