レポート プロシージャのデータセットのコードを書き直したい。
One
1)フィールドを持つデータセット( name_id
test_var
)
2)test_var
正、負、ゼロのいずれかです。
3)結果として、次のようなテーブルが必要です:
name_chr test_var_pos test_var_neg test_var_zero
/* ここにデータ、name_chr でグループ化 */
TOTAL: SUM_POS SUM_NEG SUM_ZERO <- すべての行の後、この TOTAL が必要です
4)追加: name_id => name_chr の辞書があります
5)PS: name_id にはドットが含まれています!!!!(結果テーブルにドットが必要です)
6)
data result(keep=name_chr test_var_pos test_var_neg test_var_zero);
retain name_chr "";
retain test_var_pos 0;
retain test_var_neg 0;
retain test_var_zero 0;
set One;
by name_id; /*already sorted by name_id*/
if(FIRST.name_id) then do;
name_chr="";
test_var_pos = 0;
test_var_neg = 0;
test_var_zero = 0;
end;
else do;
if(test_var>0) then test_var_pos=test_var_pos + test_var;
if(test_var<0) then test_var_neg=test_var_neg + abs(test_var);
if(test_var=0) then test_var_zero=test_var_zero + 1; /*as example, test_var_zero is a count*/
end;
if (LAST.name_id) then do;
%mFIND(name_id,name_chr);
output;
end;
run;
TOTAL
このコードを proc レポートに書き直し、このデータセットに行を追加したいと思います。
では私は何をすべきか:
1) name_id は最後にグループ値でなければなりません。
2) test_var のすべての正、負、ゼロの値を計算する必要があります。
proc report data = One out = Result_table(keep= name_chr test_var_pos test_var_neg test_var_zero);
column name_id name_chr test_var test_var_pos test_var_neg test_var_zero;
/*from One - table*/
define name_id /group;
define test_var / computed;
/*to Result_table*/
define name_chr / computed;
define test_var_pos / computed;
define test_var_neg / computed;
define test_var_zero / computed;
compute before name_id; /*is this eq to FIRST?*/
name_chr="";
test_var_pos = 0;
test_var_neg = 0;
test_var_zero = 0;
endcomp;
compute test_var_pos;
if(test_var>0) then test_var_pos = test_var_pos + test_var;
endcomp;
compute test_var_neg;
if(test_var<0) then test_var_neg = test_var_neg + abs(test_var);
endcomp;
compute test_var_zero;
if(test_var=0) then test_var_zero = test_var_zero + 1;
endcomp;
compute after name_id; /*is it eq to LAST?*/
/*magic to get name_chr*/
%mFIND(name_id,name_chr);
/*output*/
endcomp;
rbreak after / summarize;
compute after rbreak;
name_chr = "TOTAL: ";
encomp;
run;