我想使用 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)'
知道如何处理左连接和条件吗?
发生错误是因为Y中不存在start和end。
或者
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
您可以在
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