2016-09-02 2 views
0

필자는 POSIXlt 형식의 날짜 - 시간 값과 기타 숫자 및 문자 변수를 포함하는 2 개의 데이터 세트를 보유하고 있습니다.R - 가장 가까운 시간 - 날짜로 두 데이터 프레임을 조인하는 방법?

날짜 - 시간 열을 기반으로 두 데이터 세트를 결합하고자합니다. 그러나 두 데이터 세트의 날짜 스탬프가 일치하지 않으므로 가장 가까운 날짜 (이전 또는 이후)로 결합해야합니다. 예를 들어, 2016-03-01 23:52:00의 데이터 값 "e"는 "binG"가 아닌 2016-03-02 00:00:00에 "binH"와 결합해야합니다.

데이터 세트를 가장 가까운 날짜 - 시간 값으로 결합 할 수있는 기능이 있습니까?

cut() 함수 또는 data.tables의 roll = Inf 함수를 사용하여 날짜를 다음 이전 날짜와 결합하는 방법을 찾았습니다. 그러나 나는 어떤 형식 으로든 나의 타임 스탬프를 얻을 수 없었다. = '가장 가까운'이 받아 들일 것이다.

>df1 
    date1 value 
    1 2016-03-01 17:52:00  a 
    2 2016-03-01 18:01:30  b 
    3 2016-03-01 18:05:00  c 
    4 2016-03-01 20:42:30  d 
    5 2016-03-01 23:52:00  e 

    >df2 
    date2 bin_name 
    1 2016-03-01 17:00:00  binA 
    2 2016-03-01 18:00:00  binB 
    3 2016-03-01 19:00:00  binC 
    4 2016-03-01 20:00:00  binD 
    5 2016-03-01 21:00:00  binE 
    6 2016-03-01 22:00:00  binF 
    7 2016-03-01 23:00:00  binG 
    8 2016-03-02 00:00:00  binH 
    9 2016-03-02 01:00:00  binI 
+0

정말 POSIXct 형식을 의미합니다. 데이터 프레임에 POSIXlt 벡터 (실제로 목록)를 저장하는 것은 엄청난 혼란을 초래하는 처방입니다. –

답변

2

data.table는 아마도에 수동으로 날짜 컬럼에 그 변환을 수행 (자체 POSIXct에 POSIXlt를 변환하는 경향이 있지만, (당신이 맞서오고있어? 오류를 설명 할 수있는)이 작동한다 data.table 행복). roll을 사용하기 전에 키 열을 설정해야합니다.

는 (나는 내 ​​인생을 여기에 내 자신의 예를 들어 테이블을 만든 것을 조금 더 쉽게 당신이 당신에 dput 사용하려는 경우, 당신의 데이터 예 업데이트 드리겠습니다.) :

new <- data.table(date = as.POSIXct(c("2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00")), data.new = c("t","u","v")) 
head(new, 2) 

        date data.new 
1: 2016-03-02 12:20:00  t 
2: 2016-03-07 12:20:00  u 

old <- data.table(date = as.POSIXct(c("2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00", "2015-03-02 12:20:00")), data.old = c("a","b","c","d")) 
head(old, 2) 


        date data.old 
1: 2016-03-02 12:20:00  a 
2: 2016-03-07 12:20:00  b 

setkey(new, date) 
setkey(old, date) 

combined <- new[ old, roll = "nearest" ] 
combined 

        date data.new data.old 
1: 2015-03-02 12:20:00  t  d 
2: 2016-03-02 12:20:00  t  a 
3: 2016-03-07 12:20:00  u  b 
4: 2016-04-02 12:20:00  v  c 

롤링 조인이 여러 개의 일치 항목을 처리하는 방법을 보여주기 위해 의도적으로 두 개의 테이블에 서로 다른 행 길이를 만들었습니다. 조인 방식을 전환 할 수 있습니다.

combined <- old[ new, roll = "nearest" ] 
combined 

        date data.old data.new 
1: 2016-03-02 12:20:00  a  t 
2: 2016-03-07 12:20:00  b  u 
3: 2016-04-02 12:20:00  c  v 
+1

@ user2223405이 솔루션이 효과가 있습니까? 어느 쪽이든, 질문을 포기하지 않도록하십시오. 돌아와서 무엇이 효과가 있었는지, 그렇지 않은지 알려주세요. – rosscova

관련 문제