2016-07-26 31 views
0

単一のキー変数なしで2つのデータセットをマージしようとしています。キー変数なしのsasデータセットのマージ

study_id.....round....other variables different between the two sets 
A000019....R012....etc 
A000019....R013 
A000047....R013 
A000047....R014 
A000047....R015 
A000267....R014 

これは私のコードです...間で共有2つの変数のみです私はstudy_idラウンドでマージしようとしました

DATA RAKAI.complete; 
length study_id $ 8; 
MERGE hivgps2 rccsdata; 
BY study_id round; 
RUN; 

:データは、両方のデータセットでこのようになりますデータセット。しかし、2つのセットを積み重ねるだけで、正確なIDの数が2倍になります。 "study_id"と "round"の組み合わせは固有の識別子を提供しますが、変数はありません。両方のデータセットで共有される2つの変数を組み合わせることによって、新しい一意のIDをコード化するのが最も理にかなっていますか?私は私がここに潜在的な不要なスペースに対処することを意図したコードを投稿することができます実現

多くのおかげ

DATA hivgps2; 
SET hivgps2; 
study_id = compress(study_id); 
round= compress(round); 
RUN; 

DATA rccsdata; 
SET rccsdata; 
study_id = compress(study_id); 
round=compress(round); 
RUN; 

答えて

3

あなたのコードは、複数の変数によってマージするための正しいフォーマットです。両方のデータセットのレコードが含まれているので、キーが一致しない場合、結果はMERGEではなくSETを使用した場合と同じになります。

2つのデータセットの間に重複がありますか?変数の長さが同じであることを確認してください。文字の場合は、値が大文字と小文字を一貫して使用することを確認してください。値に空白やその他の非印字文字がないことを確認してください。また、データセットの1つに書式を添付していないことを確認し、印刷された値が実際にデータにない値になるようにします。

データのクリーンアップ手順では、変数の長さを強制的に一致させる必要があります。また、値からスペースだけでなく圧縮することもできます。私は通常の7ビットASCIIコードではないものを排除するのが好きです。それはタブ、非改行スペース、ヌルなどの奇妙なものを取り除きます。通常の7ビットASCIIでは、印刷可能な文字は! ( '21'x or 33 decimal)と〜(' 7E'x or 126 decimal)です。

data hivgps2_clean ; 
    length study_id $10 round $5 ; 
    set hivgps2; 
    format study_id round ; 
    study_id=upcase(compress(study_id,compress(study_id,collate(33,126)))); 
    round=upcase(compress(round,compress(study_id,collate(33,126)))); 
run; 

proc sort; by study_id round; run; 

data rccsdata_clean; 
    length study_id $10 round $5 ; 
    set rccsdata; 
    format study_id round ; 
    study_id=upcase(compress(study_id,compress(study_id,collate(33,126)))); 
    round=upcase(compress(round,compress(study_id,collate(33,126)))); 
run; 

proc sort; by study_id round; run; 

data want; 
    merge hivgps2_clean(in=in1) rccsdata_clean(in=in2); 
    by study_id round; 
run; 
+0

データを見ると、ほぼ完全に重なるはずです。私はフォーマットがありません、値は同じに見えるし、潜在的なスペースに対処しようとするためにそこにこのコードを持っていました、私が想像するフォーマット混乱のおかげで申し訳ありません。 DATA hivgps2; SET hivgps2; study_id =圧縮(study_id); round = compress(round); RUN; DATA rccsdata; SET rccsdata; study_id =圧縮(study_id); round = compress(round); RUN; – jkh107

+0

甘いイエストムは働いた!私はそのコードを勉強する必要があるので、次回にやることができます。 – jkh107

0

あなたはそれを試すことができ、またはあなただけのproc SQLを使用することができます参加:

proc sql; 
    create table rakai.complete as select 
     a.*, b.* 
     from hivgps2 as a 
     full join rccsdata as b 
     on a.study_id = b.study_id and a.round = b.round; 
quit; 
+0

私はそれが間違って適用することができるが、私は、コード内のスロットたときにそれはまだ私に82206回の観測の未結合セット(各セットが41103を含んでいる)を与えます。私は完全に統合された1組の41103 obsを撮影しています。あなたを間違って読んでいますか? – jkh107

+0

両方のデータセットで観測を識別する 'study_id'と' round'変数がある場合、これはそれに応じて結合する必要があります。あなたのデータセットのサンプルを投稿できますか? – superfluous

+0

確かに、私はそれを正しい方法で行う方法がわかりません。私の最初の質問とすべて – jkh107

関連する問題