3

SAS にマージしたい 2 つのデータセットがありますが、共通の変数がありません。一方のデータセットには「subject_id」変数があり、もう一方には「mom_subject_id」変数があります。これらの変数はどちらも 9 桁のコードで、コードの中央にある 3 桁のみが共通の意味を持ちます。2 つのデータセットをマージする際に、これらのデータセットを一致させる必要があります。

私がやりたいことは、サブジェクト ID 内の 3 桁の新しい共通変数を各データセットに作成することです。これらの 3 桁は常に 9 桁のサブジェクト ID 内の同じ場所にあるため、変数からこれらの 3 桁を抽出して新しい変数を作成する方法があるかどうか疑問に思っています。

ありがとう!

4

3 に答える 3

7

SQL(データステップコードのサンプルデータを使用):

proc sql;
 create table want2 as  
 select a.subject_id, a.other, b.mom_subject_id, b.misc
 from have1 a JOIN have2 b 
  on(substr(a.subject_id,4,3)=substr(b.mom_subject_id,4,3));
quit;

データステップ:

 data have1;
  length subject_id $9;
  input subject_id $ other $;
  datalines;
   abc001def other1
   abc002def other2
   abc003def other3
   abc004def other4
   abc005def other5
  ;

 data have2;
  length mom_subject_id $9;
  input mom_subject_id $ misc $;
  datalines;
   ghi001jkl misc1
   ghi003jkl misc3
   ghi005jkl misc5
  ;

 data have1;
  length id $3;
  set have1;
  id=substr(subject_id,4,3);
 run;

 data have2;
  length id $3;
  set have2;
  id=substr(mom_subject_id,4,3);
 run;

 Proc sort data=have1;
  by id;
 run;

 Proc sort data=have2;
  by id;
 run;

 data work.want;
  merge have1(in=a) have2(in=b);
  by id;
 run;
于 2012-06-01T22:19:16.187 に答える
0

別の方法は、を使用することです

    proc sql

次に 、SQLに慣れている場合は、上記で説明したように、 joinsubstr()を使用します。

于 2012-06-01T22:31:55.403 に答える
0

「subject_id」変数が数値であると仮定すると、substrsas が数値を文字列に変換しようとするため、関数は機能しません。ただし、デフォルトでは、数値の左側にいくつかのペースがパディングされます。

mod(input, base)入力を基数で割ったときの余りを返す係数関数を使用できます。

/*First get rid of the last 3 digits*/
temp_var = floor( subject_id / 1000);
/* then get the next three digits that we want*/
id = mod(temp_var ,1000);

または1行で:

id = mod(floor(subject_id / 1000), 1000);

次に、新しいデータ セットを ID で並べ替えてから、マージを続行できます。

于 2014-10-13T12:59:43.867 に答える