2016-06-01 26 views
2

2つをマージしようとしていますdata.tables。一つは、毎年二国間であるような:Rは、各四半期の次元を展開しながら、四半期ごとのdata.tableを両側の年次データにマージします。

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) 

が、私は(countrypairためNA'sしかしcountryに対応aggregate_valueで)四半期を埋めるしたいと思いますので、私はduplicatしたいですeは、各二国間ペアの四半期データセットの値で、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国に対応します" - 私が間違っていない限り、これはあなたの 'ゴール'データセットには保持されません。また、あなたはFRとFrの国を使用しているようです...あなたの例をもっと慎重にしたり簡略化したりできます。 – Frank

+0

Frが編集しました、thatnks!集計されたデータは国のすべてのカウンターパーティーのために繰り返され、細かいことは –

答えて

2

[OK]をクリックします。私はこれが目標と同じ出力を返すと思います。それはあなたのコードを含む、次いで所望のレベルに拡張する後クロス(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

thats完璧、ありがとう!私はクロスジョインについて知りませんでした。まさに私が探していたものです:-) –

+1

ありがとう、フランク。私はその議論が何をしているのか疑問に思いました。 – lmo

関連する問題