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

Rat*_*nil 4 join r 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)
Run Code Online (Sandbox Code Playgroud)

期望的结果:

                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
Run Code Online (Sandbox Code Playgroud)

为了实现这一点,我将data.frames转换为data.tables并使用滚动连接"nearest",如下所示:

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
Run Code Online (Sandbox Code Playgroud)

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

dt3 <- dt2[dt1,roll = "nearest", mult = "first"]
Run Code Online (Sandbox Code Playgroud)

这导致相同的输出,"A"使用两次.我的错误在哪里?

Dav*_*urg 10

当运行dt2[dt1, roll = "nearest"]你基本上是说:" 从返回行dt2根据最近加入到每一行dt1使用的关键.因此,

  • dates2一个dt2是最接近dates1一个dt1
  • dates2一个dt2最近的以 dates12dt1
  • dates2在排2dt2是最接近 dates13dt1

因此,

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
Run Code Online (Sandbox Code Playgroud)

这是所有从行dt1与加入values2dt2.


相反,我们希望加入周围的其他方式,即" 提取values2dt2根据最近通过加入每一行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
Run Code Online (Sandbox Code Playgroud)

一些额外的说明

  • 你不需要先包装data.frame然后再包装data.table,你可以这样做dt1 <- data.table(dates1, values1)等等.
  • 当你在它时,你已经可以使用key参数data.table,即dt1 <- data.table(dates1, values1, key = "dates1")等等即时设置键.
  • 或者你可以一起跳过设置键,on而是使用(V 1.9.6+),即dt1[dt2, roll = "nearest", values2 := i.values2, on = c(dates1 = "dates2")]
  • 最后,请作出不必要的副本,例如,而不是避免<-data.table(df)使用:=setDT(df),看到这里获取更多信息