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

时间:2016-09-08 18:45:23

标签: r data.table sqldf

我有两个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)

3 个答案:

答案 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
相关问题