2015-10-26 50 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.'(如果兩個數據集中有相同的列)。 –