2015-10-26 39 views
3

我有两个data.frames每个与时间序列。我的目标是使用df2的时间序列来标记df1中最接近的时间戳。 df2中的每个时间戳只应在df1中标记一个时间戳!R data.table滚动连接“mult”不按预期方式工作

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和使用滚动joing “最近”,像这样:

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。我希望每个值2只能使用一次,并查阅data.table手册,我期望通过使用选项mult =“first”来解决此问题。

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

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

回答

7

当运行dt2[dt1, roll = "nearest"]你基本上是说“根据最近从df2返回行加入到每一行dt1使用该密钥。所以在

  • dates2一个dt2是最靠近dates1一个dt1
  • dates2dt2一个是在排最接近dates1行在dt1
  • dates2dt2 是在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的行与加入的values2dt2


取而代之的是,我们要“根据最近从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 <- 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),看到here更多信息
+0

@大卫Arenburg:非常感谢你的帮助!我一直重复使用这个脚本和其他输入。但是你在这里做了什么魔术。 “values2:= i.values2”。这个“我”在哪里?来自?我扫描了这个功能的文档,但没有找到一个完美的。 – Ratnanil

+0

'i.'表示从'i'参数中的数据集取得的值。如果你做'dt1 [dt2]',那么'dt2'在'dt1'的第i个参数中,因为你可能知道一个'data.table'对象的形式是DT [i,j,by ]'。所以如果你想确保你在'dt1 [dt2]'时从'dt2'中提取列,那么最好使用'i.'(如果两个数据集中有相同的列)。 –