根据两个data.tables

时间:2016-03-02 01:11:09

标签: 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)

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

y[x[status==1] & yend>xend,yend:=xend]

最简单的方法是什么?

1 个答案:

答案 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]