我正在尝试使用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)
现在在y
我希望在yend
时更新专栏status == 1 and yend > xend
,以便yend
成为xend
。当然,以下表示法不执行操作,因为我将data.table与表达式混合,但我认为这将有助于显示我想要做的事情。
y[x[status==1] & yend>xend,yend:=xend]
最简单的方法是什么?
答案 0 :(得分:6)
使用NOCB(下一个观察结果)滚动连接:
# v1.9.6
y[x[status == 1L], yend := i.xend, on=c(id="id", yend="xend"), roll=-Inf]
如果要沿每个组的边缘滚动,还要查看rollends
参数。
不再需要setkey()
,实现了新的on=
参数,允许 adhoc 加入(作为子集)。
从下一个版本开始,on=c("id", yend="xend")
就足够了。
请注意,这只会替换yend
的第一个> xend
值。要替换所有值,我们需要执行尚未实现的非equi 连接,但我们正在研究这些连接。
在此之前,您可以按照@Frank的建议使用pmin
,但您需要by=.EACHI
:
y[x[status == 1L], yend := pmin(yend, i.xend), on="id", by=.EACHI]