2016-06-01 2 views
2

data.tables 두 개를 병합하려고합니다. 하나는 연간 양자 간 등 :R 합계 분기 별 데이터 테이블을 양측 연간 데이터 테이블에 병합합니다. 각 분기 별 차원을 확장하면서

quarterly <- data.table(country=c(rep("DE",4),rep("AT",4)), 
        time=c(rep(c("2001Q1","2001Q2","2001Q3","2001Q4"),2)), 
        aggregate_value=rnorm(8)) 

내가 올해 물론 작동 시간 (yearquarter)에 의해 병합 할 :

을 같은

library(data.table) 
bilateral <- data.table(country=c("AT","AT","DE","DE"), 
      counterparty=c("DE","FR","AT","FR"), 
      time=c("2001Q1"), 
      bilateral_value=rnorm(4)) 
bilateral[,countrypair:=paste(country,counterparty,sep="_")] 

분기 집계되고 다른,

Data <- merge(bilateral, quarterly,by=c("country","time"),all=T) 

하지만, 그래서 duplicat 할 (country에 해당하는 countrypair에 대한 NA's하지만 aggregate_value 사용) 분기를 채우기 위해 싶습니다 각 쌍 쌍에 대한 분기 별 데이터 세트의 값은 country을 기준으로합니다. 나는 이것이 merge.data.table에 직접적으로 가능해야한다고 생각하지만 나는 어떻게 생각할 수 없다.

내가 목표로하고있다 :

goal <- data.table(country=c(rep("DE",8),rep("AT",8)), 
        counterparty=c("AT",NA,NA,NA,"FR",NA,NA,NA,"DE",NA,NA,NA, 
            "FR",NA,NA,NA), 
        time=c(rep(c("2001Q1","2001Q2","2001Q3","2001Q4"),4)), 
        bilateral_value=c(Data[1,bilateral_value],NA,NA,NA, 
            Data[2,bilateral_value],NA,NA,NA, 
            Data[6,bilateral_value],NA,NA,NA, 
            Data[7,bilateral_value],NA,NA,NA), 
        countrypair=c("AT_DE",NA,NA,NA,"AT_FR",NA,NA,NA,"DE_AT",NA,NA,NA, 
           "DE_FR",NA,NA,NA), 
        aggregate_value=c(rep(Data[2:5,aggregate_value],2), 
            rep(Data[7:10,aggregate_value],2))) 
+0

"aggregate_value 국가에 대응하는 '- 내가 잘못 본 것이 아니라면 이것은'goal' 데이터 세트에 들어 있지 않습니다. 또한 FR과 Fr 국가를 사용하는 것 같습니다. 예를 들어 더 조심하거나 단순화 할 수 있습니다. – Frank

+0

Fr이 (가) 편집했습니다. 모든 국가의 모든 거래 상대방에 대해 집계 된 데이터가 반복됩니다. –

답변

2

좋아. 나는 이것이 목표와 같은 산출물을 반환한다고 생각한다. 그것은 당신의 코드를 포함하고 원하는 레벨로 확장 이후 크로스가 (CJ)에 가입 사용 @Frank는 지적

# set key for cross join 
setkey(Data, country, counterparty, time) 
temp <- Data[CJ(unique(country), 
     unique(counterparty), unique(time))][country != counterparty & !is.na(counterparty)] 

는,이 단축 될 수있다 (더 효율적일 수 있습니다) 고유 인수를 사용하여 CJ :

temp <- Data[CJ(country, counterparty, time, unique=T) 
       ][country != counterparty & !is.na(counterparty)] 

마지막 총액 변수 좌측을 사용하여 충전 분기에 조인

# remove partially filled agg_value column 
temp[, aggregate_value := NULL] 
# join on full aggregate value column 
temp[quarterly, on=c("country", "time")] 
+0

은 완벽합니다. 감사합니다. 나는 crossjoin에 대해 잘 몰랐다. 내가 정확히 찾고있는 것이었다 :-) –

+1

고마워, 프랭크. 나는 그 논쟁이 무엇을하고 있는지 궁금해했다. – lmo

관련 문제