R data.table 更新插入操作

R data.table upsert operation

我没有找到如何使用 data.table 执行更新插入操作。

例如,假设我有:

library(data.table)
> (a=data.table(x=1:2,y=1:2))
   x y
1: 1 1
2: 2 2
> (b=data.table(x=c(1,3),y=c(10,1)))
   x  y
1: 1 10
2: 3  1

我试过了

> merge(a,b,all=TRUE)
   x  y
1: 1  1
2: 1 10
3: 2  2
4: 3  1

> a[b,on="x",mult="last"]
   x  y i.y
1: 1  1  10
2: 3 NA   1

想要的结果

   x y
1: 1 10
2: 2 2
3: 3 1

我做了 google 没有找到答案。

为了完成,这个问题更加通才,因为我有几个 data.table 超过 300 列。就我而言,其中一列包含区分数据的年份;这导致提出的可能性/答案。

如果一开始就没有这样的列,可以轻松添加它以反映 merge/upsert 在应用解决方案之前的优先级。

感谢@akrun,考虑到我确实有额外的列允许我区分数据,这是一个解决方案。

> (a=data.table(x=1:2,y=1:2,year=2013))
   x y year
1: 1 1 2013
2: 2 2 2013
> (b=data.table(x=c(1,3),y=c(10,1),year=2014))
   x  y year
1: 1 10 2014
2: 3  1 2014
> (c=data.table(x=c(1,3,4),y=c(100,99,4),year=2015))
   x   y year
1: 1 100 2015
2: 3  99 2015
3: 4   4 2015
> rbind(a,b,c)[order(x,-year)][!duplicated(x)]
   x   y year
1: 1 100 2015
2: 2   2 2013
3: 3  99 2015
4: 4   4 2015

你可以做到

unique(rbind(a,b), by = "x", fromLast = TRUE)

这使得条目在 x 列方面是唯一的,具有每个 x 值的最后一个条目具有优先权。

它扩展到更多列by = c("x", "y")。它还扩展到您有两个以上表的情况。将 rbind(a,b) 替换为 rbind(a,b,c,...);或者,如果表在列表中,rbindlist(L).