2017-11-28 16 views
1

가있어 두 개의 샘플 데이터 세트 :data.table 조건 불평등에 가입

> aDT 
    col1 col2 ExtractDate 
1: 1 A 2017-01-01 
2: 1 A 2016-01-01 
3: 2 B 2015-01-01 
4: 2 B 2014-01-01 
> bDT 
    col1 col2 date_pol Value 
1: 1 A 2017-05-20  1 
2: 1 A 2016-05-20  2 
3: 1 A 2015-05-20  3 
4: 2 B 2014-05-20  4 

내가 필요

> cDT 
    col1 col2 ExtractDate date_pol Value 
1: 1 A 2017-01-01 2016-05-20  2 
2: 1 A 2016-01-01 2015-05-20  3 
3: 2 B 2015-01-01 2014-05-20  4 
4: 2 B 2014-01-01   NA NA 
기본적으로

, ADT는 COL1에 따라 BDT 가입 왼쪽, COL2 및 ExtractDate> = date_pol , 첫 번째 일치 만 유지하십시오 (예 : 최고 date_pol). 데카르트 조인은 메모리 제한 때문에이 허용되지 않습니다.

참고 : 생성하려면 샘플 데이터 세트

aDT <- data.table(col1 = c(1,1,2,2), col2 = c("A","A","B","B"), ExtractDate = c("2017-01-01","2016-01-01","2015-01-01","2014-01-01")) 
bDT <- data.table(col1 = c(1,1,1,2), col2 = c("A","A","A","B"), date_pol = c("2017-05-20","2016-05-20","2015-05-20","2014-05-20"), Value = c(1,2,3,4)) 
cDT <- data.table(col1 = c(1,1,2,2), col2 = c("A","A","B","B"), ExtractDate = c("2017-01-01","2016-01-01","2015-01-01","2014-01-01") 
        ,date_pol = c("2016-05-20","2015-05-20","2014-05-20",NA), Value = c(2,3,4,NA)) 


aDT[,ExtractDate := ymd(ExtractDate)] 
bDT[,date_pol := ymd(date_pol)] 
aDT[order(-ExtractDate)] 
bDT[order(-date_pol)] 

나는 시도했다 :

aDT[, c("date_pol", "Value") := 
     bDT[aDT, 
      .(date_pol, Value) 
      ,on = .(date_pol <= ExtractDate 
       ,col1 = col1 
       ,col2 = col2) 
      ,mult = "first"]] 

그러나 결과는 조금 이상한이다 : 나는 data.table 인 경우

> aDT 
    col1 col2 ExtractDate date_pol Value ##date_pol values not right 
1: 1 A 2017-01-01 2017-01-01  2 
2: 1 A 2016-01-01 2016-01-01  3 
3: 2 B 2015-01-01 2015-01-01  4 
4: 2 B 2014-01-01 2014-01-01 NA 

답변

2

을 i의 열은 접두사 i를 사용하여 j에서 참조 할 수 있습니다 (예 : X[Y, .(val, i.val)]). 여기서 val은 X의 열과 i.val Y를 나타냅니다. 접두어 x를 사용하여 x의 열을 이제 참조 할 수 있습니다. 특히 x의 조인 열을 참조하기 위해 조인하는 동안 유용합니다. 그렇지 않으면 x의 조인 열은 i가 마스크합니다. 예 : X[Y, .(x.a-i.a, b), on="a"].

bDT[aDT, .(col1, col2, i.ExtractDate, x.date_pol, Value), 
    on = .(date_pol <= ExtractDate, col1 = col1, col2 = col2), 
    mult = "first"] 

출력

col1 col2 i.ExtractDate x.date_pol Value 
1: 1 A 2017-01-01 2016-05-20  2 
2: 1 A 2016-01-01 2015-05-20  3 
3: 2 B 2015-01-01 2014-05-20  4 
4: 2 B 2014-01-01  <NA> NA