我有两个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;使用两次。我的错误在哪里?
答案 0 :(得分:9)
运行dt2[dt1, roll = "nearest"]
时,您基本上会说&#34; 根据df2
中最近的连接返回每行的行dt1
使用密钥。所以
dates2
在dt2
中的一个行中距离dates1
<{1}} <{1}} <{1}} < / LI>
dt1
在dates2
中一个的行中距离dt2
<{1}} <行中的dates1
最近 < / LI>
dt1
在dates2
中的两个行中距离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")
on
和dt1[dt2, roll = "nearest", values2 := i.values2, on = c(dates1 = "dates2")]
使用<-
和data.table(df)
,请参阅here了解详情< / LI>