1 人あたり 4 つの観測 (行) を持つデータセットがあります。
2 行目と 1 行目、3 行目と 2 行目、4 行目と 3 行目の差を計算する 3 つの新しい変数を作成したいと考えています。
保持はこれを行うことができると思いますが、方法がわかりません。
それとも配列が必要ですか?
ありがとう!
1 人あたり 4 つの観測 (行) を持つデータセットがあります。
2 行目と 1 行目、3 行目と 2 行目、4 行目と 3 行目の差を計算する 3 つの新しい変数を作成したいと考えています。
保持はこれを行うことができると思いますが、方法がわかりません。
それとも配列が必要ですか?
ありがとう!
data output_data;
retain count previous_value diff1 diff2 diff3;
set data input_data
by person;
if first.person then do;
count = 0;
end;
else do;
count = count + 1;
if count = 1 then diff1 = abs(value - previous_value);
if count = 2 then diff2 = abs(value - previous_value);
if count = 3 then do;
diff3 = abs(value - previous_value);
output output_data;
end;
end;
previous_value = value;
run;
代わりに dif() 関数を使用しないのはなぜですか?
/* test data */
data one;
do id = 1 to 2;
do v = 1 to 4 by 1;
output;
end;
end;
run;
/* check */
proc print data=one;
run;
/* on lst
Obs id v
1 1 1
2 1 2
3 1 3
4 1 4
5 2 1
6 2 2
7 2 3
8 2 4
*/
/* now create diff within id */
data two;
set one;
by id notsorted; /* assuming already in order */
dif = ifn(first.id, ., dif(v));
run;
proc print data=two;
run;
/* on lst
Obs id v dif
1 1 1 .
2 1 2 1
3 1 3 1
4 1 4 1
5 2 1 .
6 2 2 1
7 2 3 1
8 2 4 1
*/