2016-07-01 3 views
1

data.tableパッケージからローリングジョインを使用しようとしていますが、私が望む出力を得ることができません。あるR - data.tableを使用したローリングジョインのための予期しない出力

dt_minutes <- data.table(datetime = c(as.POSIXct("2016-05-01 18:59:00"),as.POSIXct("2016-05-01 19:00:00"),as.POSIXct("2016-05-01 19:01:00"))) 

> dt_minutes 
       datetime 
1: 2016-05-01 18:59:00 
2: 2016-05-01 19:00:00 
3: 2016-05-01 19:01:00 

と私が手出力:

私のデータは次のとおりです。

library(data.table) 

dt <- fread(' datetime price 
"2016-05-01 18:58:49.078" 2059.25 
"2016-05-01 18:58:49.078" 2059.25 
"2016-05-01 18:58:49.078" 2059.25 
"2016-05-01 18:58:49.078" 2059.25 
"2016-05-01 18:58:51.085" 2059.25 
"2016-05-01 18:58:51.085" 2059.25 
"2016-05-01 18:58:51.085" 2059.25 
"2016-05-01 18:58:51.085" 2059.25 
"2016-05-01 18:58:51.085" 2059.25 
"2016-05-01 18:58:51.085" 2059.25 
"2016-05-01 18:58:51.085" 2059.25 
"2016-05-01 18:58:53.703" 2059.25 
"2016-05-01 18:58:53.757" 2059.25 
"2016-05-01 18:58:53.757" 2059.25 
"2016-05-01 18:58:53.757" 2059.25 
"2016-05-01 18:58:54.155" 2059.50 
"2016-05-01 18:59:07.013" 2059.25 
"2016-05-01 18:59:07.013" 2059.25 
"2016-05-01 18:59:07.015" 2059.25 
"2016-05-01 18:59:08.604" 2059.25 
"2016-05-01 18:59:31.500" 2059.50 
"2016-05-01 18:59:40.723" 2059.25 
"2016-05-01 18:59:40.723" 2059.25 
"2016-05-01 19:00:00.003" 2059.50 
"2016-05-01 19:00:00.003" 2059.50 
"2016-05-01 19:00:00.003" 2059.50 
"2016-05-01 19:00:00.359" 2059.50 
"2016-05-01 19:00:00.381" 2059.50 
"2016-05-01 19:00:02.390" 2059.50 
"2016-05-01 19:00:04.355" 2059.50 
"2016-05-01 19:00:06.230" 2059.50', header = T) 

dt$datetime <- as.POSIXct(dt$datetime) 

と私は毎分で最新の価格を知りたい

> dt[dt_minutes, roll = TRUE, on = "datetime"] 
       datetime price 
1: 2016-05-01 18:59:00 2059.5 
2: 2016-05-01 19:00:00 2059.5 
3: 2016-05-01 19:00:00 2059.5 
4: 2016-05-01 19:00:00 2059.5 
5: 2016-05-01 19:01:00 2059.5 

が、私は期待する:

1: 2016-05-01 18:59:00 2059.5 
2: 2016-05-01 19:00:00 2059.25 
5: 2016-05-01 19:01:00 2059.5 

誰かがなぜ私の出力とその時間の間違った価格で "2016-05-01 19:00:00"を繰り返すのか知っていますか?

+1

あなたの 'dt'に重複があるためですか? 'unique(dt)[dt_minutes、roll = TRUE、on =" datetime "]' – SymbolixAU

+0

でそれを試してみてください。しかし、中価格はまだ間違っています。 私は2016-05-01 19:00:00.003 "2059.50"の行がその時間の後であっても2016-05-01 19:00:00 "'分カウントされていると感じます。 – AndrewK

+0

Rはミリ秒の頭痛をたくさん与えているようです。 – AndrewK

答えて

1

コメントにフランクの答えを書き留めて、setNumericRounding(0)を実行すると、あなたが望む結果が得られます。

あなたはそれはそれは同様最初の場所に丸められたかも明確にすべきであるあなたの dt_minutesでキーと一致するから を巻いた時見にdtであなたのdatetime変数のコピーを保存することができ、また

注意:

dt[ , dt_datetime_orig := datetime] # make a copy of time variable 
setNumericRounding(2) # 2 is the default 
dt[dt_minutes, roll = TRUE, on = "datetime"] 
##    datetime price dt_datetime_orig 
## 1: 2016-05-01 18:59:00 2059.5 2016-05-01 18:58:54 
## 2: 2016-05-01 19:00:00 2059.5 2016-05-01 19:00:00 
## 3: 2016-05-01 19:00:00 2059.5 2016-05-01 19:00:00 
## 4: 2016-05-01 19:00:00 2059.5 2016-05-01 19:00:00 
## 5: 2016-05-01 19:01:00 2059.5 2016-05-01 19:00:06 
setNumericRounding(0) 
dt[dt_minutes, roll = TRUE, on = "datetime"] 
##    datetime price dt_datetime_orig 
## 1: 2016-05-01 18:59:00 2059.50 2016-05-01 18:58:54 
## 2: 2016-05-01 19:00:00 2059.25 2016-05-01 18:59:40 
## 3: 2016-05-01 19:01:00 2059.50 2016-05-01 19:00:06 
関連する問題