2016-07-01 2 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)을 실행하면 Frank의 답변을 바탕으로 원하는 결과를 얻을 수 있습니다.

당신이 그것뿐만 아니라 처음에 반올림 된 방법도 명확하게해야합니다 귀하의 dt_minutes에서 키와 일치하는에서 을 압연하는 시간을 볼 수 dtdatetime 변수의 사본을 저장할 수 있습니다 또한

주 :

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 
관련 문제