簡體   English   中英

將 2 個 data.tables 與多於一列的 data.table 方式合並

[英]Merge 2 data.tables with more than one column the data.table way

我有兩個data.table s 如下:-

a <- data.table(id = 1:10, val = 2010:2019)
b <- data.table(id = c(1, 2, 4, 6), year = 1:4)

現在,如果我將ba合並如下:-

b[a, val := i.val, on = "id"]

這將在b創建一個名為val的額外列。 這也不會為b data.table重新分配內存。

我想知道,如果a超過2列,是如下: -

    a <- data.table(id = 1:10, val = 2010:2019,
                    twr = c(10, 13, 22 ,43, 23, 23, -4, 33, -54, 34))

如何合並兩個data.table s( ba ), data.table方式,即不使用merge或任何join函數。

但是使用[, , on = "id"]語法。

我想知道這一點,因為使用任何join函數或merge都會創建一個全新的對象,而data.table方式只創建新列而不是一個全新的對象。

提前致謝。

如果只有兩列要返回,只需on通過 'id' 加入后用list (或短格式.( ) 包裝,然后將:= )這些列分配給 'b'

b[a, names(a)[-1] := .(i.val, i.twr), on = .(id)]

如果要返回的列很多

nm1 <- names(a)[-1]
b[a, (nm1) := mget(paste0("i.", nm1)), on = .(id)]

-輸出

b
   id year  val twr
1:  1    1 2010  10
2:  2    2 2011  13
3:  4    3 2013  43
4:  6    4 2015  23

在開發版本 1.14.1 中, 獲得了env參數,用於在 data.table 上進行編程

cols <- setdiff(names(a), "id")
b[a, on = "id", (cols) := acols, env = list(acols = as.list(cols))][]
 id year val twr 1: 1 1 2010 10 2: 2 2 2011 13 3: 4 3 2013 43 4: 6 4 2015 23

這在許多情況下都有效,其中ab除了要加入的列名之外沒有重復的列名。 但是,我們可以通過使用前綴i.來顯式地引用a的列i.

b[a, on = "id", (cols) := acols, env = list(acols = as.list(paste0("i.", cols)))][]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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