2014-11-12 2 views
3

나는 2tables이 : 나는 "시간"이 아니라 하나 개의 조건으로 하나 명의 테이블 그룹에있는 그 두 테이블을 병합 할 수 있습니다 방법조건부 병합 테이블

Time  X1 
    8/1/2013 56 
    9/1/2013 14 
    10/1/2013 8 
    11/1/2013 4 
    12/1/2013 78 

    Time  X2 
    8/1/2013 42 
    9/1/2013 44 
    10/1/2013 2 
    11/1/2013 75 
    12/1/2013 36 

: 첫 번째 테이블의 달 형태로 다음 달 일치해야합니다 두 번째 - 첫 번째 테이블에서 9 월과 같은 두 번째 테이블에서 10 월 일치해야합니다.

감사합니다.

답변

4

data.tablerolling join

library(data.table) 
setkey(setDT(dat1)[, Time := as.Date(Time, format = "%m/%d/%Y")], Time) 
setkey(setDT(dat2)[, Time := as.Date(Time, format = "%m/%d/%Y") - 1], Time) 
dat2[dat1, roll = -Inf] 
#   Time X2 X1 
# 1: 2013-08-01 44 56 
# 2: 2013-09-01 2 14 
# 3: 2013-10-01 75 8 
# 4: 2013-11-01 36 4 
# 5: 2013-12-01 NA 78 

편집을위한 완벽한 작업은 다음과 같습니다 당신은 타의 추종을 불허하는 행을 원하지 않는 경우, nomatch = 0

dat2[dat1, roll = -Inf, nomatch = 0] 
#   Time X2 X1 
# 1: 2013-08-01 44 56 
# 2: 2013-09-01 2 14 
# 3: 2013-10-01 75 8 
# 4: 2013-11-01 36 4 
+0

감사합니다 사용! 왜'-Inf'를 넣었는지 설명해 주시겠습니까? – user45415631

+0

현재 값과 얼마나 멀리 떨어져 있더라도 롤백하여 첫 번째 일치 항목을 찾습니다. 네가 알아 차리면, 나는'dat2'에'-1'을 설정했습니다. 또한 우리가 한 달 뒤로 (30 일) 일치하기 때문에'dat2 [dat1, roll = -30]'과도 작동 할 것입니다. –

+0

어떻게 일치하지 않는 NAs로 출력 할 수 있습니까? – user45415631