我有两个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行一个在dt1dates2行一个在dt2最近的以 dates1行2中dt1dates2在排2中dt2是最接近 dates1行3中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
Run Code Online (Sandbox Code Playgroud)
这是所有从行dt1与加入values2的dt2.
相反,我们希望加入周围的其他方式,即" 提取values2从dt2根据最近通过加入每一行中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),看到这里获取更多信息