2017-07-12 5 views
0

私は以下のようなデータセットを持っています。人は「パッシブ」、「アクティブ」、「その他」のいずれかになります。人が「アクティブ」になる前に、人が「パッシブ」である週数を計算したいと思います。変数 'start_week'は、 'passive'呪文がいつ始まるかを示します。ある人が複数の「パッシブ」呪文を持っている場合、次の行で観測が再開されますが、start_weekは別です。SASは特定の瓶の複数の呪文の持続時間を計算します

ID y_1449 y_1448 y_1449 y_1450 y_1451 y_1452 y_1501 ... y_1608 start_week 
01 passive passive passive passive active active active ...   5 
02 other passive active active active passive active ...   3 
02 other passive active active active passive active ...   7 
04 
... 
N other other  other other passive active active ...   6 

私が持っているコードは、唯一のスペルでの観測の期間を計算することができますが、観測が繰り返し発生しているとき、何かがうまくいかないと期間のどちらが正しく計算されています。私は次のコードを持っている:

%let period = y_1449-y_1452 y_1501-y_1553 y_1601-y_1608; 
%let passive = 'passive'; 
%let active = 'active'; 

data want; 
    data have; 
    array y(*) $period; 
    transition_to_active=0; 
    weeks=0; 
    active_week; 

    do i=start_week to 62; 
     if y(i) in &passive. then do; 
       weeks=weeks+1; 
     end; 

     if y(i) in &active. and y(i+1) in &active. 
     and y(i+2) in &active. and y(i+3) in &active. then do; 
      transition_to_active=1; 
      active_week=i; 
      leave; 
     end; 
    end; 
run; 

ここ「をtransition_toアクティブは、」人は「アクティブ」と「active_week」から「受動的」人が、この遷移することを週を示しているからtranistionを行っているかどうかを示します。 期間の計算が複数の呪文ではうまくいかない理由は誰にも見えますか?

+0

あなたのデータ、アルゴリズムの説明、およびあなたの実装は、多少矛盾しています。すべてのレコード例では、start_weekがアクティブな週の(1から始まる)インデックスに設定されていますが、受動的な週ではありません。なぜあなたはアクティブに移行をマークするために連続した4週間を必要としますか?実際に何が起こっているのかを表示し、「何かが間違っている」というよりむしろそれが間違っている理由を説明してください。 –

答えて

1

私は、これはあなたの問題を解決思う:

data input; 
input ID start_week y_1447 $ y_1448 $ y_1449 $ y_1450 $ y_1451 $ y_1452 $ y_1501 $; 
datalines; 
01 3 passive passive passive passive active active active 
02 5 other passive active active active passive active 
02 7 other passive active active active passive active 
; 
run; 

%let period = y_1447--y_1501; 
%let passive = 'passive'; 
%let active = 'active'; 

data want; 
set input; 
array y[*] . 
by ID; 

last_sw = lag(start_week); 
if first.id then 
    weeks = start_week-1; 
else do; 
    start = last_sw; 

    weeks = 0; 

    do i=start to start_week; 
     if y[i]= &passive then 
      weeks = weeks + 1; 
    end; 
end; 

drop start last_sw i; 
run; 
は、最後 START_WEEKであなたのカウントループを開始し、「受動」の数をカウントし、新しい START_WEEKに到達したときに停止

IDが初めての場合は、開始までの週数を取得するには、START_WEEKから1を引いた値にする必要があります。

関連する問題