我有两个data.table(dt1& dt2)。 dt1是过去的产品数据,dt2是产品数据。我想创建第三个data.table,仅当产品特征(级别或颜色)不同或产品本身不同时,才会将dt2中的新行插入dt1。
library(data.table)
dt1 <- fread('
Product Level Color ReviewDate
A 0 Blue 9/7/2016
B 1 Red 9/7/2016
C 1 Purple 9/7/2016
D 2 Blue 9/7/2016
E 1 Green 9/7/2016
F 4 Yellow 9/7/2016
')
dt2 <- fread('
Product Level Color ReviewDate
A 1 Black 9/8/2016
B 1 Red 9/8/2016
C 5 White 9/8/2016
D 2 Blue 9/8/2016
E 1 Green 9/8/2016
F 4 Yellow 9/8/2016
G 3 Orange 9/8/2016
')
我的最终data.table(dt3)应该有以下变化:At和C在dt2中都不同于dt1,这就是为什么来自dt2的新(不同)行与dt1中的所有行一起插入到最终表中的原因。 G是一个全新的产品,不在dt1中,这就是它进入决赛桌的原因。
Product Level Color ReviewDate
A 0 Blue 9/7/2016
A 1 Black 9/8/2016
B 1 Red 9/7/2016
C 1 Purple 9/7/2016
C 5 White 9/8/2016
D 2 Blue 9/7/2016
E 1 Green 9/7/2016
F 4 Yellow 9/7/2016
G 3 Orange 9/8/2016
我试过了:
setkey(dt1, Product)
setkey(dt2, Product)
dt3<- dt1[dt2]
setkey(dt3,Product,ReviewDate)
答案 0 :(得分:4)
你可以堆叠和统一:
unique(rbind(dt1, dt2), by=c("Product", "Level", "Color"))
答案 1 :(得分:3)
另一种选择是仅对不同数据的子集进行rbind(避免创建一个包含dt1和dt2的大数据。)
dt3 <- rbind(dt1, setDT(dt2)[!dt1, on=c("Product", "Level", "Color")])
dt3[order(Product, ReviewDate),]
答案 2 :(得分:1)
使用合并...
d<-merge(dt1, dt2, by=c("Product","Level","Color"), all.x=T,all.y=TRUE)
d$ReviewDate <-ifelse(is.na(d$ReviewDate.x), d$ReviewDate.y, d$ReviewDate.x)
as.data.frame(select(d, 1,2,3,6))
Product Level Color ReviewDate
1 A 0 Blue 9/7/2016
2 A 1 Black 9/8/2016
3 B 1 Red 9/7/2016
4 C 1 Purple 9/7/2016
5 C 5 White 9/8/2016
6 D 2 Blue 9/7/2016
7 E 1 Green 9/7/2016
8 F 4 Yellow 9/7/2016
9 G 3 Orange 9/8/2016