求助:SAS中无需转置实现列累积求和的正确方法
解决SAS跨变量累积求和问题(不使用转置)
首先,我们来明确你的需求:对每行的N1、N2、N3进行逐变量累积求和,生成B1、B2、B3,其中缺失值按0处理——也就是B1=N1,B2=N1+N2,B3=N1+N2+N3,缺失值不参与累加。
你的原代码存在几个关键问题:数组未关联目标变量、索引错误、未处理缺失值且无累积状态重置,导致无法运行或结果不符合预期。下面是修正后的可行代码,完全满足你的需求:
data temp2; set temp; /* 定义原变量数组,明确指定顺序避免意外 */ array hh(*) N1 N2 N3; /* 定义新变量数组,对应生成B1/B2/B3 */ array bb(3) B1 B2 B3; /* 定义累积器,每行开始时重置为0 */ running_total = 0; do i = 1 to dim(hh); /* sum函数自动忽略缺失值,等价于把缺失当作0计算 */ running_total = sum(running_total, hh(i)); /* 将当前累积值赋值给对应新变量 */ bb(i) = running_total; end; /* 清理临时变量,避免输出到结果数据集 */ drop i running_total; run;
代码解释:
- 数组定义:
hh数组绑定N1/N2/N3,bb数组绑定要生成的B1/B2/B3,确保位置一一对应;如果你的数据集里只有N1-N3三个以N开头的变量,用N:代替N1 N2 N3也可以,但明确指定变量更安全。 - 累积器重置:
running_total = 0确保每行的累积从0开始,不会跨行累积。 - 缺失值处理:SAS的
sum()函数会自动忽略缺失值,完美解决你示例中缺失值的场景。
测试示例数据:
如果你的原数据集temp是:
data temp; input N1 N2 N3; datalines; 1 1 1 1 . 1 1 1 . ; run;
运行修正后的代码后,temp2的输出结果完全符合你的期望:
| N1 | N2 | N3 | B1 | B2 | B3 |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 2 | 3 |
| 1 | . | 1 | 1 | 1 | 2 |
| 1 | 1 | . | 1 | 2 | 2 |
原代码问题梳理:
array bb(3);未指定关联变量,生成的是bb1/bb2/bb3而非你需要的B1/B2/B3;bb(i)=bb(i)+hh(i+1)中,bb(i)初始为缺失值,累加后仍为缺失;且i+1会导致循环到i=3时访问不存在的hh(4),引发语法错误;- 没有重置累积状态,会导致跨行累积,不符合每行独立计算的需求。
内容的提问来源于stack exchange,提问作者user3658367
相关产品推荐
相关产品推荐

