簡體   English   中英

Data.table 連接變量列名

[英]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' 

我嘗試了各種方法,例如:

  1. 用 "eval()" 或 "noquote" 將 x 和 y 括起來
  2. 將 pmap 函數放在 data.table 中,而不是如上所示放在外面。

這兩種方法都不起作用。 任何幫助將不勝感激,因為必須寫出單獨的連接語句顯然效率極低!

謝謝,菲爾

編輯:

下面建議我應該考慮使用“合並”功能。 理論上,這適用於上面的示例,但是我上面沒有提到我實際上需要使用非對等連接,這意味着,據我所知,我不能使用“合並”。 在我的實際案例中,我需要通過函數將列名映射到等值和非等值連接的組合。

我提供了一個帶有目標輸出的后續示例。 該示例只有兩個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM