【问题标题】:R data.table rolling join "mult" not working as expectedR data.table 滚动连接“mult”未按预期工作
【发布时间】:2016-01-25 14:39:57
【问题描述】:

我有两个 data.frame,每个都有一个时间序列。我的目标是使用 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

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

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

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

【问题讨论】:

    标签: r join data.table


    【解决方案1】:

    当运行dt2[dt1, roll = "nearest"] 时,您基本上是在说“根据与dt1每一行 的最近连接,使用键,返回dt2 中的行。所以

    • dt2 中的第 one 行中的 dates2 最接近 dt1 中的第 one 行中的 dates1
    • dt2 中的第 one 行中的 dates2 最接近 dt1 中的第 2 行中的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 的连接values2


    相反,我们希望以相反的方式加入,即“根据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 &lt;- data.table(dates1, values1)等等。
    • 当您使用它时,您已经可以使用key 参数data.table 即时设置密钥,即dt1 &lt;- data.table(dates1, values1, key = "dates1") 等。
    • 或者你可以一起跳过设置键并使用on代替(V 1.9.6+),即dt1[dt2, roll = "nearest", values2 := i.values2, on = c(dates1 = "dates2")]
    • 最后,请避免制作不必要的副本,例如,不要使用&lt;-data.table(df) 使用:=setDT(df),请参阅here 了解更多信息

    【讨论】:

    • @David Arenburg:非常感谢您的帮助!我一直在重复使用这个脚本和你的其他输入。但是你在这里做了什么魔法。 “值2:= i.values2”。这个“我”在哪里。来自?我扫描了此功能的文档,但没有找到解释..
    • i. 表示取自 i 参数中的数据集的值。如果您使用dt1[dt2],那么dt2 位于dt1ith 参数中,因为您可能知道data.table 对象是DT[i, j, by] 的一种形式。因此,如果您想确保在执行dt1[dt2] 时从dt2 中提取列,那么最好使用i.(以防两个数据集中有相同的列)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2016-04-18
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多