通过插入与旧行不同的新行来更新 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),]
我有两个 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),]