我正在尝试使用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)
最简单的方法是什么?
使用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)