2016-11-29 2 views
0

SASのデータセットで次の観測のスコアを取得するには、Next_Row_score列の現在の観測値を使用する必要があります。次の観測が存在しない場合、列Next_Row_scoreの現在の観測値はグループ(ID)に対して 'ヌル'でなければならない。私は、データセット以下のサンプルを提供してきた、より良い説明のために:グループごとに次の観測を取得する

ID Score 
10 1000 
10 1500 
10 2000 
20 3000 
20 4000 
30 2500 

結果の出力は次のようにする必要があります -

ID Salary Next_Row_Salary 
10 1000 1500 
10 1500 2000 
10 2000 . 
20 3000 4000 
20 4000 . 
30 2500 2500 

あなたの助けのために事前にありがとうございます。

+0

は、あなたがライセンスを持っていますsas/etsのために? – Reeza

答えて

1
data want(drop=_: flag); 
    merge have have(firstobs=2 rename=(ID=_ID Score=_Score)); 
    if ID=_ID then do; 
     Next_Row_Salary=_Score; 
     flag+1; 
    end; 
    else if ID^=_ID and flag>=1 then do; 
      Next_Row_Salary=.; 
      flag=.; 
    end; 
    else Next_Row_Salary=score; 
run; 
+0

Hey Shenglin Chen、ありがとうございました。ただし、あなたが提供するコードを使用して、私はSalaryカラムのnext_row_salaryの値だけを取得できます。したがって、出力は質問に記載されているような希望の形式ではありません。 –

+0

さて、私はちょうど編集しました。 –

0

これを試してみてください:

data have; 
    input ID Score; 

    datalines; 
10 1000 
10 1500 
10 2000 
20 3000 
20 4000 
30 2500 
; 
run; 

proc sql noprint; 
    select count(*) into :obsHave 
    from have; 
quit; 

data want2(rename=(id1=ID Score1=Salary) drop=ID id2 Score); 
    do i=1 to &obsHave; 
     set have point=i; 
     id1=ID; 
     Score1=Score; 
     j=i+1; 
     set have point=j; 
     id2=ID; 
     if id1=id2 then do; 
      Next_Row_Salary = Score; 
     end; 
     else Next_Row_Salary="."; 
     output; 
    end; 
stop; 
; 
run; 
0

はループを伴わない単純な(私の心の中で、少なくとも)のprocのSQL​​アプローチがあります:

data have; 
    input ID Score; 
    datalines; 
10 1000 
10 1500 
10 2000 
20 3000 
20 4000 
30 2500 
; 
run; 

/*count each observation's place in its ID group*/ 
data have2; 
    set have; 
    count + 1; 
    by id; 
    if first.id then count = 1; 
run; 

/*if there is only one ID in a group, keep original score, else lag by 1*/ 
proc sql; 
    create table want as select distinct 
     a.id, a.score, 
     case when max(a.count) = 1 then a.score else b.score end as score2 
     from have2 as a 
     left join have2 (where = (count > 1)) as b 
     on a.id = b.id and a.count = b.count - 1 
     group by a.id; 
quit; 
関連する問題