在SAS中按id计算基于column_a-column_b的累计余额
按ID分组计算SAS数据集的累计余额
原始数据集
| id | column_a | column_b |
|---|---|---|
| 1 | 10 | 8 |
| 1 | 7 | 1 |
| 1 | 0 | 10 |
| 2 | 8 | 8 |
| 2 | 10 | 1 |
| 2 | 10 | 0 |
需求说明
按id分组,逐行累加column_a - column_b的结果,生成balance列,期望输出如下:
期望输出数据集
| id | column_a | column_b | balance |
|---|---|---|---|
| 1 | 10 | 8 | 2 |
| 1 | 7 | 1 | 8 |
| 1 | 0 | 10 | -2 |
| 2 | 8 | 8 | 0 |
| 2 | 10 | 1 | 9 |
| 2 | 10 | 0 | 19 |
解决方案
方法1:DATA步(推荐,适配逐行处理场景)
若原始数据集已按id排序,直接执行以下代码:
data final_data; set original_data; by id; /* 每个id组的第一行初始化余额为0 */ if first.id then balance = 0; /* 逐行累加(column_a - column_b)的结果 */ balance + (column_a - column_b); run;
如果原始数据集未按id排序,需先完成排序:
proc sort data=original_data; by id; run;
方法2:PROC SQL窗口函数(SAS 9.2及以上版本支持)
借助窗口函数直接计算分组累计和:
proc sql; create table final_data as select id, column_a, column_b, sum(column_a - column_b) over (partition by id order by monotonic()) as balance from original_data; quit;
monotonic()函数用于确保按原始数据行顺序累加,若数据已有明确排序字段,可替换为对应字段。
内容的提问来源于stack exchange,提问作者Deivid
相关产品推荐
相关产品推荐

