在 SAS 循环中改变行号
Vary Row numbers in SAS Loop
我有一个 NXN 数据集,我想从中得到一行 (1XN) 输出。我需要计算每列中的百分比。当我沿着列移动时,分子和分母继续从下面的 1 行减少。
我拥有的数据:
Category Month 0 1 2 3 4 5 6 7 8 9
Categ_1 Month_1 15 15 15 14 14 13 13 13 13 13
Categ_1 Month_2 8 8 8 7 6 5 5 5 5 5
Categ_1 Month_3 15 15 14 14 14 12 11 11 11 10
Categ_1 Month_4 17 17 17 15 14 14 13 12 11 11
Categ_1 Month_5 25 25 25 23 21 19 18 16 16 16
Categ_1 Month_6 21 21 18 17 14 13 12 11 11 8
Categ_1 Month_7 29 28 25 23 20 18 15 14 13 13
Categ_1 Month_8 32 31 30 28 25 23 21 20 18 17
Categ_1 Month_9 38 37 35 32 27 24 23 20 17 16
Categ_1 Month_10 30 30 28 27 24 21 20 18 17 17
我要的是
Categ_1 100% 99% 94% 87% 82% 79% 76% 76% 78% 87%
第 1 列的位置(即 100%)=(第 0 个月的总数)/(第 0 个月的总数)
其中第 2 列(即 99%)=(第 1 个月最后一行的总数)/(第 0 个月最后一行的总数)等等...
我在 excel 中使用简单的 OFFSET 公式完成了它。如果有人能帮我用 SAS 编写代码,那就太好了。我发现在改变要考虑的行时很难跨列循环。
提前致谢!!
这给出了正确的输出。诀窍是遍历所有变量,并在每一步(数据步的迭代)中多留一个变量。
DATA in_data ;
INPUT Category $ Month $ var_0 - var_9 ;
DATALINES;
Categ_1 Month_1 15 15 15 14 14 13 13 13 13 13
Categ_1 Month_2 8 8 8 7 6 5 5 5 5 5
Categ_1 Month_3 15 15 14 14 14 12 11 11 11 10
Categ_1 Month_4 17 17 17 15 14 14 13 12 11 11
Categ_1 Month_5 25 25 25 23 21 19 18 16 16 16
Categ_1 Month_6 21 21 18 17 14 13 12 11 11 8
Categ_1 Month_7 29 28 25 23 20 18 15 14 13 13
Categ_1 Month_8 32 31 30 28 25 23 21 20 18 17
Categ_1 Month_9 38 37 35 32 27 24 23 20 17 16
Categ_1 Month_10 30 30 28 27 24 21 20 18 17 17
;
data out_data;
do until (last.Category);
set in_data;
format out_0 - out_9 percent.;
array in [*] var_0 - var_9;
array out [*] out_0 - out_9;
by Category;
if first.Category then count = 0;
count + 1;
do i = 1 to dim(in) + 1 - count;
out[i] = sum(out[i],in[i]);
if dim(in) + 1 - i = count then out[i] = out[i] /out[1];
end;
end;
drop var_: month i count;
run;
编辑:编辑时出现错误,现已修复
我有一个 NXN 数据集,我想从中得到一行 (1XN) 输出。我需要计算每列中的百分比。当我沿着列移动时,分子和分母继续从下面的 1 行减少。
我拥有的数据:
Category Month 0 1 2 3 4 5 6 7 8 9
Categ_1 Month_1 15 15 15 14 14 13 13 13 13 13
Categ_1 Month_2 8 8 8 7 6 5 5 5 5 5
Categ_1 Month_3 15 15 14 14 14 12 11 11 11 10
Categ_1 Month_4 17 17 17 15 14 14 13 12 11 11
Categ_1 Month_5 25 25 25 23 21 19 18 16 16 16
Categ_1 Month_6 21 21 18 17 14 13 12 11 11 8
Categ_1 Month_7 29 28 25 23 20 18 15 14 13 13
Categ_1 Month_8 32 31 30 28 25 23 21 20 18 17
Categ_1 Month_9 38 37 35 32 27 24 23 20 17 16
Categ_1 Month_10 30 30 28 27 24 21 20 18 17 17
我要的是
Categ_1 100% 99% 94% 87% 82% 79% 76% 76% 78% 87%
第 1 列的位置(即 100%)=(第 0 个月的总数)/(第 0 个月的总数) 其中第 2 列(即 99%)=(第 1 个月最后一行的总数)/(第 0 个月最后一行的总数)等等...
我在 excel 中使用简单的 OFFSET 公式完成了它。如果有人能帮我用 SAS 编写代码,那就太好了。我发现在改变要考虑的行时很难跨列循环。
提前致谢!!
这给出了正确的输出。诀窍是遍历所有变量,并在每一步(数据步的迭代)中多留一个变量。
DATA in_data ;
INPUT Category $ Month $ var_0 - var_9 ;
DATALINES;
Categ_1 Month_1 15 15 15 14 14 13 13 13 13 13
Categ_1 Month_2 8 8 8 7 6 5 5 5 5 5
Categ_1 Month_3 15 15 14 14 14 12 11 11 11 10
Categ_1 Month_4 17 17 17 15 14 14 13 12 11 11
Categ_1 Month_5 25 25 25 23 21 19 18 16 16 16
Categ_1 Month_6 21 21 18 17 14 13 12 11 11 8
Categ_1 Month_7 29 28 25 23 20 18 15 14 13 13
Categ_1 Month_8 32 31 30 28 25 23 21 20 18 17
Categ_1 Month_9 38 37 35 32 27 24 23 20 17 16
Categ_1 Month_10 30 30 28 27 24 21 20 18 17 17
;
data out_data;
do until (last.Category);
set in_data;
format out_0 - out_9 percent.;
array in [*] var_0 - var_9;
array out [*] out_0 - out_9;
by Category;
if first.Category then count = 0;
count + 1;
do i = 1 to dim(in) + 1 - count;
out[i] = sum(out[i],in[i]);
if dim(in) + 1 - i = count then out[i] = out[i] /out[1];
end;
end;
drop var_: month i count;
run;
编辑:编辑时出现错误,现已修复