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

前端之家收集整理的这篇文章主要介绍了R data.table滚动连接“mult”未按预期工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个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并使用滚动连接“最近”,如下所示:

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“A”使用两次,一次用于12:00时间戳,一次用于13:00.我希望每个value2只使用一次,并查阅data.table手册我希望使用选项mult =“first”来解决这个问题.

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

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

解决方法

当运行dt2 [dt1,roll =“nearest”]时,你基本上是说“使用键将df2中的行根据最近的连接返回到dt1中的每一行.所以

> dt2中第一行中的dates2最接近dt1中第一行中的dates1
> dt2中第一行中的dates2最接近dt1中第二行中的dates1
> dt2中第二行中的dates2最接近dt1中第三行中的dates1

因此,

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

这是来自dt1的所有行以及来自dt2的连接值2.

相反,我们希望以相反的方式加入,即“使用密钥根据dt2中每行的最近连接从dt2中提取值2,并更新dt1中的匹配行”,即

dt1[dt2,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)等.
>在使用它时,您可以使用关键参数data.table动态设置密钥,即dt1< - data.table(dates1,values1,key =“dates1”)等.
>或者你可以一起跳过设置键并改为使用(V 1.9.6),即dt1 [dt2,roll =“nearest”,values2:= i.values2,on = c(dates1 =“dates2”)]
>最后,请不要制作不必要的副本,例如,而不是< - 和data.table(df)使用:=和setDT(df),有关详细信息,请参阅here

猜你在找的MsSQL相关文章