时间序列的data.table合并,一些公共列被合并到同一列中

时间:2018-07-26 09:48:13

标签: r data.table

虽然我在这里看到许多合并的答案,但我正在尝试对两个表共有的数据进行时间序列合并。

#Simple example
d1 <- data.table(date = as.Date(c("2018-07-03", "2018-07-05")), x = c(1, 3), y = c(1, 2))
d2 <- data.table(date = as.Date("2018-07-04"), x = 2, z = 5)

setkey(d1, date)
setkey(d2, date)

我想将各列合并在一起。当我进行合并时,我会得到:

xx <- merge(d1, d2, all = TRUE)
#          date x.x  y x.y  z
# 1: 2018-07-03   1  1  NA NA
# 2: 2018-07-04  NA NA   2  5
# 3: 2018-07-05   3  2  NA NA

我不想重复x.x和x.y列。我想要的是这个

xx2 <- rbind(d1,d2, fill = TRUE)[order(date)]
#          date x  y  z
# 1: 2018-07-03 1  1 NA
# 2: 2018-07-04 2 NA  5
# 3: 2018-07-05 3  2 NA

我想对非常大的数据集执行此操作。有没有更好的方法来进行此合并,或者正在做rbind,然后再进行最佳排序?

2 个答案:

答案 0 :(得分:2)

setkeydate上仅x

d1 <- data.table(date = as.Date(c("2018-07-03", "2018-07-05")), x = c(1, 3), y = c(1, 2))
d2 <- data.table(date = as.Date("2018-07-04"), x = 2, z = 5)

setkey(d1, date, x)
setkey(d2, date, x)

xx <- merge(d1, d2, all = TRUE)
> xx
         date x  y  z
1: 2018-07-03 1  1 NA
2: 2018-07-04 2 NA  5
3: 2018-07-05 3  2 NA

答案 1 :(得分:1)

这对我有用,无需设置按键:

library(data.table)   # version 1.11.4 used
d1 <- data.table(date = as.Date(c("2018-07-03", "2018-07-05")), x = c(1, 3), y = c(1, 2))
d2 <- data.table(date = as.Date("2018-07-04"), x = 2, z = 5)
merge(d1, d2, all = TRUE)
         date x  y  z
1: 2018-07-03 1  1 NA
2: 2018-07-04 2 NA  5
3: 2018-07-05 3  2 NA

作为rbind(d1, d2, fill = TRUE)[order(date)]的替代方法,您可以尝试

rbindlist(list(d1, d2), fill = TRUE)[order(date)]

以data.tables列表作为第一个参数。