gpt4 book ai didi

r - 同时连接和更新受两个 data.tables 上的 where 子句的约束

转载 作者:行者123 更新时间:2023-12-05 00:19:31 26 4
gpt4 key购买 nike

我正在尝试使用 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我要更新专栏 yendstatus == 1 and yend > xend以便 yend变成 xend .当然,以下符号不会执行操作,因为我将 data.table 与表达式混合,但我认为这有助于显示我想要做什么。
y[x[status==1] & yend>xend,yend:=xend]

什么是最简单的方法来做到这一点?

最佳答案

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

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

也看看 rollends如果要沿每个组的边缘滚动,则为参数。

没必要 setkey()不再使用新的 on=实现的参数允许临时连接(作为子集)。

从下一版本开始, on=c("id", yend="xend")应该足够了。

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

在此之前,您可以使用 pmin正如@Frank 所建议的那样,但您需要 by=.EACHI :
y[x[status == 1L], yend := pmin(yend, i.xend), on="id", by=.EACHI]

关于r - 同时连接和更新受两个 data.tables 上的 where 子句的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35736667/

26 4 0