R data.table滚动连接" mult"没有按预期工作

时间:2015-10-26 13:16:29

标签: r join data.table

我有两个data.frames,每个都有一个时间序列。我的目标是使用df2的时间序列来标记df1中最接近的时间戳。 df2中的每个时间戳只应在df1中标记一个时间戳!

dates1 <-  as.POSIXct(c("2015-10-26 12:00:00","2015-10-26 13:00:00","2015-10-26 14:00:00"))
values1 <- c("a","b","c")

dates2 <- as.POSIXct(c("2015-10-26 12:05:00","2015-10-26 13:55:00"))
values2 <- c("A","C")

df1 <- data.frame(dates1, values1)
df2 <- data.frame(dates2, values2)

期望的结果:

                dates2 values2 values1
1: 2015-10-26 12:00:00       A       a
2: 2015-10-26 13:00:00       NA      b
3: 2015-10-26 14:00:00       C       c

为了实现这一目标,我将data.frames转换为data.tables并使用滚动连接&#34;最近的&#34;像这样:

dt1 <- data.table(df1)
dt2 <- data.table(df2)

setkey(dt1,"dates1")
setkey(dt2,"dates2")

dt3 <- dt2[dt1,roll = "nearest"]

                dates2 values2 values1
1: 2015-10-26 12:00:00       A       a
2: 2015-10-26 13:00:00       A       b
3: 2015-10-26 14:00:00       C       c

值2&#34; A&#34;使用两次,一次用于12:00时间戳,一次用于13:00。我希望每个value2只使用一次,并查阅data.table手册我希望使用选项 mult =&#34; first&#34; 来解决这个问题。

dt3 <- dt2[dt1,roll = "nearest", mult = "first"]

这导致相同的输出,&#34; A&#34;使用两次。我的错误在哪里?

1 个答案:

答案 0 :(得分:9)

运行dt2[dt1, roll = "nearest"]时,您基本上会说&#34; 根据df2中最近的连接返回每行的行dt1使用密钥。所以

  • dates2dt2中的一个行中距离dates1 <{1}} <{1}} <{1}} < / LI>
  • dt1dates2一个的行中距离dt2 <{1}} <行中的dates1最近 < / LI>
  • dt1dates2中的两个行中距离dt2 <{1}} <行中的dates1最近 < / LI>

因此,

dt1

来自dt2[dt1, roll = "nearest"] # dates2 values2 values1 # 1: 2015-10-26 12:00:00 A a # 2: 2015-10-26 13:00:00 A b # 3: 2015-10-26 14:00:00 C c 的{​​{1}}来自dt1的行全部

相反,我们希望以相反的方式加入,即&#34; values2提取dt2,根据最近的每一行加入values2使用密钥并更新dt2 &#34;中的匹配行,即

dt2

一些额外的说明

  • 您不需要先包装到dt1然后再包装到dt1[dt2, roll = "nearest", values2 := i.values2] dt1 # dates1 values1 values2 # 1: 2015-10-26 12:00:00 a A # 2: 2015-10-26 13:00:00 b NA # 3: 2015-10-26 14:00:00 c C ,您只需要data.frame等等。
  • 当您使用data.table参数dt1 <- data.table(dates1, values1)时,您已经可以设置密钥,即key等。
  • 或者您可以跳过设置所有密钥并改为使用data.table(V 1.9.6 +),即dt1 <- data.table(dates1, values1, key = "dates1")
  • 最后,请不要制作不必要的副本,例如代替ondt1[dt2, roll = "nearest", values2 := i.values2, on = c(dates1 = "dates2")]使用<-data.table(df),请参阅here了解详情< / LI>