我想在报告过程中重写数据集的代码。
1)One
带字段的数据集 ( 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;
我想在 proc 报告中重写此代码并将TOTAL
行添加到此数据集。
所以,我做什么:
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;