data.table 带条件左连接

问题描述 投票:0回答:2

我想使用 id 作为连接变量和条件将 Y 左连接到 X。应保留 X 的所有行。这是一个最小的例子:

X <- data.table( 
    id = 1:5
  , start = 1:5
  , end   = 5:9
  , x = LETTERS[1:5]
)

Y <- data.table(
    id = 3:5
  , date = c(1,5,7)
  , y = letters[3:5]
)

X
   id start end x
1:  1     1   5 A
2:  2     2   6 B
3:  3     3   7 C
4:  4     4   8 D
5:  5     5   9 E
                
Y
   id date y
1:  3    1 c
2:  4    5 d
3:  5    7 e

我用这个加入:

Y[X,on=.(id=id, between(date,start, end))]

并期望这样:

    id date x start end y
1:  1    NA NA    1   5 A
2:  2    NA NA    2   6 B
3:  3    NA NA    3   7 C
4:  4    5  d     4   8 D
5:  5    7  e     5   9 E

但出现以下错误:

Error in colnamesInt(x, names(on), check_dups = FALSE) : 
  argument specifying columns specify non existing column(s): cols[2]='between(date, start, end)'

知道如何处理左连接和条件吗?

r conditional-statements data.table left-join
2个回答
0
投票

发生错误是因为Y中不存在startend

或者

replace
连接后的值,因为无论如何您都想保留所有行。

library(dplyr)
library(data.table)

merge(X, Y, "id", all=T) %>% 
  mutate(across(c(date, y), ~ replace(.x, !between(date, start, end), NA)))
   id start end x date    y
1:  1     1   5 A   NA <NA>
2:  2     2   6 B   NA <NA>
3:  3     3   7 C   NA <NA>
4:  4     4   8 D    5    d
5:  5     5   9 E    7    e

0
投票

您可以在

Y
列上使用
between
match
进行子集化,然后使用
X
进行连接。

> Y[with(X[match(Y$id, id)], between(Y$date, start, end))][X, on=.(id)]
   id date    y start end x
1:  1   NA <NA>     1   5 A
2:  2   NA <NA>     2   6 B
3:  3   NA <NA>     3   7 C
4:  4    5    d     4   8 D
5:  5    7    e     5   9 E
© www.soinside.com 2019 - 2024. All rights reserved.