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)
.
我没有找到如何使用 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)
.