根据两个data.tables的where子句同时加入和更新

use*_*086 4 r data.table

我正在尝试使用data.table包来更新data.table,y具体取决于与列y相关的列的位置x,其中两个数据帧可以通过id映射在一起.

考虑以下两个data.tables:

x <- data.table(id=c(1,2,3),status=c(0,1,1),xend=c(2,4,7))
y <- data.table(id=c(1,1,2,2,3,3),yend=c(2,2,3,5,6,8))
setkey(x,id)
setkey(y,id)
Run Code Online (Sandbox Code Playgroud)

现在y我想要更新列yend,status == 1 and yend > xend这样yend就变成了xend.当然以下表示法不执行操作,因为我将data.table与表达式混合,但我认为这将有助于显示我想要做的事情.

y[x[status==1] & yend>xend,yend:=xend]
Run Code Online (Sandbox Code Playgroud)

最简单的方法是什么?

Aru*_*run 6

使用NOCB(下一个观察结果)滚动连接:

# v1.9.6
y[x[status == 1L], yend := i.xend, on=c(id="id", yend="xend"), roll=-Inf]
Run Code Online (Sandbox Code Playgroud)

rollends如果要沿每个组的边缘滚动,还要查看参数.

没有必要setkey()再使用on=实现的新参数允许adhoc连接(作为子集).

从下一个版本来看,on=c("id", yend="xend")应该足够了.


请注意,这只会替换第一个yend> xend.要替换所有值,我们需要执行一个尚未实现的非equi连接,但我们正在研究这些连接.

在此之前,您可以pmin按照@Frank的建议使用,但您需要by=.EACHI:

y[x[status == 1L], yend := pmin(yend, i.xend), on="id", by=.EACHI]
Run Code Online (Sandbox Code Playgroud)