通过插入与旧行不同的新行来更新 data.table

Updating data.table by inserting new rows that are different from old rows

我有两个 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) 应该具有以下 changes:A 和 C 在 dt2 中都不同于 dt1,这就是为什么 dt2 中的新(不同)行被插入到最终 table 以及 dt1 中的所有行。 G 是一个全新的产品,不在 dt1 中,这就是为什么它进入最终 table。

    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)

你可以堆叠和统一化:

unique(rbind(dt1, dt2), by=c("Product", "Level", "Color"))

使用合并...

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

另一种选择是只绑定不同的数据子集(避免创建一个包含 dt1 和 dt2 的大 data.table)

dt3 <- rbind(dt1, setDT(dt2)[!dt1, on=c("Product", "Level", "Color")])
dt3[order(Product, ReviewDate),]