0

coaches_assistants次の構造で呼び出される SAS データセットがあります。ごとに常に 2 つのレコードしかありませんTeamID

TeamID     Team_City    CoachCode
123        Durham       Head_242
123        Durham       Assistant_876
124        London       Head_876
124        London       Assistant_922
125        Bath         Head_667
125        Bath         Assistant_786
126        Dover        Head_544
126        Dover        Assistant_978
...        ...          ....

これでやりたいことは、と呼ばれる追加のフィールドを持つデータセットを作成し、次のAssistantCodeようにすることです。

TeamID     Team_City    HeadCode   AssistantCode
123        Durham       242        876
124        London       876        922
125        Bath         667        786
126        Dover        544        978
...        ...          ...        ...

可能であれば、これを 1 つの DATA ステップで実行したいと考えています (ただし、最初に PROC SORT ステップが必要になる可能性があることは認識しています)。Python、Ruby、または従来のスクリプト言語で行う方法は知っていますが、SAS で行う方法はわかりません。

これを行う最善の方法は何ですか?

4

3 に答える 3

1

考えられる解決策は 2 つあります (1 つは要求に応じてデータ ステップを使用し、もう 1 つは PROC SQL を使用します)。

data have;
   length TeamID $3 Team_City CoachCode $20; 
   input TeamID $ Team_City $ CoachCode $;
   datalines;
123        Durham       Head_242
123        Durham       Assistant_876
124        London       Head_876
124        London       Assistant_922
125        Bath         Head_667
125        Bath         Assistant_786
126        Dover        Head_544
126        Dover        Assistant_978
run;

/* A data step solution */
proc sort data=have;
   by TeamID;
run;

data want1(keep=TeamID Team_City HeadCode AssistantCode);
   /* Define all variables, retain the new ones */
   length TeamID $3 Team_City $20 HeadCode $3 AssistantCode $3; 
   retain HeadCode AssistantCode; 
   set have;
      by TeamID;
   if CoachCode =: 'Head'
      then HeadCode = substr(CoachCode,6,3);
      else AssistantCode = substr(CoachCode,11,3);
   if last.TeamID;
run;

/* An SQL solution */
proc sql noprint;
   create table want2 as
   select TeamID
        , max(Team_City) as Team_City
        , max(CASE WHEN CoachCode LIKE 'Head%'
                   THEN substr(CoachCode,6,3) ELSE ' '
              END) LENGTH=3 as HeadCode
        , max(CASE WHEN CoachCode LIKE 'Assistant%'
                   THEN substr(CoachCode,11,3) ELSE ' '
              END) LENGTH=3 as AssistantCode
   from have
   group by TeamID;
quit;

PROC SQL には、事前にデータをソートする必要がないという利点があります。

于 2013-07-06T18:27:12.043 に答える