2017-12-20 7 views
4

私は2つのデータセットを持っていますが、私が欲しいのは、「キー以外の変数の外部結合」と呼ばれることがあります。キー以外の変数のすべての「出現」をマージする

oc oc2 state_id r_state r_country 
A011 A01 1808 1.00 0.62 
A012 A01 1808 NA  0.14 
A013 A01 1808 NA  0.24 
A011 A01 1810 0.50 0.62 
A012 A01 1810 0.50 0.14 
A013 A01 1810 NA  0.24 
A011 A01 1814 0.33 0.62 
A012 A01 1814 0.33 0.62 
A013 A01 1814 0.33 0.24 

注意をどのように行番号:ここ

は、データセットは、

データセットの出力は、次のされて、私が欲しいものを1

oc oc2 state_id r_state 
A011 A01 1808 1.00  
A011 A01 1810 0.50  
A012 A01 1810 0.50  
A011 A01 1814 0.33  
A012 A01 1814 0.33  
A013 A01 1814 0.33  

データセット2

oc r_country 
A011 0.62 
A012 0.14 
A013 0.24 

です2,3、および6が「人工的に」導入された。私の質問はRでこれを行う方法です。ocでマージすると、merge関数はこれらの行を作成しません。 oc2でマージすると、不要な余分な行が作成されます。 oc2は、ちょうどocの上位レベルのコーディングであることに注意してください。以下は、上記のデータセットをdata.tablesに入れるためのコードです。これらはサンプルデータセットであり、実際のデータはおよそ50個の異なるoc2を含み、各oc2は1〜9個のocを含むことができます。また、47の異なる州があります。

DT1 = data.table(oc = c('A011','A011','A012','A011','A012','A013'), 
       oc2 = rep('A01',6), 
       state_id = c(1808,1810,1810,1814,1814,1814), 
       r_state = c(1, 0.5,0.5,0.33,0.33,0.33) 
       ) 

DT2 = data.table(oc = c('A011','A012','A013'), 
        r_country = c(0.62, 0.14, 0.24) 
       ) 

私はdata.tableを使用していますが、ベースdata.frameソリューションも行います。

答えて

5

使用:

library(zoo) # for the 'na.locf'-function 

DT1[CJ(oc = oc, state_id = state_id, unique = TRUE), on = .(oc, state_id) 
    ][order(state_id), oc2 := na.locf(oc2), by = 'state_id' 
     ][DT2, on = 'oc', r_country := r_country][order(state_id)] 

ができます:

DT1[CJ(oc = oc, state_id = state_id, unique = TRUE), on = .(oc, state_id) 
    ][DT2, on = .(oc), r_country := i.r_country][DT1, on = .(state_id), oc2 := i.oc2][] 

@フランクの提案パー
 oc oc2 state_id r_state r_country 
1: A011 A01  1808 1.00  0.62 
2: A012 A01  1808  NA  0.14 
3: A013 A01  1808  NA  0.24 
4: A011 A01  1810 0.50  0.62 
5: A012 A01  1810 0.50  0.14 
6: A013 A01  1810  NA  0.24 
7: A011 A01  1814 0.33  0.62 
8: A012 A01  1814 0.33  0.14 
9: A013 A01  1814 0.33  0.24 

、あなたもzoo -packageからna.locfを使用せずにそれを行うことができます

+1

おかげで、私は秒単位で考えていた "プロセス" を実施しています。私は 'CJ'と' on'について全く知らなかった。私はそれらについてどこで読むのですか? –

+0

また、 'on =。(oc、state_id)'は私にエラーを投げます。 'on = c( 'oc'、 'state_id')'を使う必要がありました。古いバージョンの 'データがあるかもしれません。テーブル ' –

+0

@ GauravSinghal私はバージョン* 1.10.4-3を使用しています*;どのバージョンを使用していますか? – Jaap

1

これは三重が一緒にこれらの4つのテーブルを結合した結合を使用して、単一のSQL文のように表すことができる:

一意 oc値から形成される
  • oc
  • 一意 state_id値から形成される
  • state_id、 Tを使用して
  • DT1
  • DT2

彼のコード:この出力を与える

library(sqldf) 

sql <- " 
    with 
     oc as (select distinct oc from DT1), 
     state_id as (select distinct state_id from DT1) 

    select * 
     from oc 
     join state_id 
     left join DT1 using (oc, state_id) 
     left join DT2 using (oc) 
     order by state_id, oc" 

sqldf(sql) 

oc state_id oc2 r_state r_country 
1 A011  1808 A01 1.00  0.62 
2 A012  1808 <NA>  NA  0.14 
3 A013  1808 <NA>  NA  0.24 
4 A011  1810 A01 0.50  0.62 
5 A012  1810 A01 0.50  0.14 
6 A013  1810 <NA>  NA  0.24 
7 A011  1814 A01 0.33  0.62 
8 A012  1814 A01 0.33  0.14 
9 A013  1814 A01 0.33  0.24 
関連する問題