如何按ID对多组变量求和并将结果置于首次出现行?
实现SAS数据集需求的两种方法
针对你提出的需求——在每个ID的首行添加该ID下Value1、Value2、Value3的非缺失值总和,其余行Total设为缺失,以下是两种可行的实现方法:
方法一:先汇总再合并(推荐,直观易维护)
步骤1:生成每个ID的总和数据集
先遍历原数据集,计算每个ID对应的非缺失值总和:
data sum_id; set DB; by ID; retain sum_val; /* 每个ID首次出现时初始化总和为0 */ if first.ID then sum_val = 0; /* 累加当前行的非缺失值,sum函数自动忽略缺失值 */ sum_val = sum(sum_val, Value1, Value2, Value3); /* 每个ID最后一行时输出总和记录 */ if last.ID then output; /* 只保留需要的ID和总和字段 */ keep ID sum_val; run;
步骤2:合并原数据集与总和数据集,生成目标数据集
将原数据和总和数据按ID合并,仅在ID首行保留总和,其余行设为缺失:
data DB1; merge DB sum_id; by ID; /* 首行赋值总和,其余行设为缺失 */ if first.ID then Total = sum_val; else Total = .; /* 丢弃中间变量 */ drop sum_val; run;
方法二:单数据步直接处理(适合熟悉SAS指针操作的用户)
通过数据步的point=指针和循环,在单步内完成总和计算与目标数据集生成:
data DB1; set DB; by ID; retain total_sum; if first.ID then do; total_sum = 0; /* 循环遍历当前ID的所有行,计算总和 */ do until(last.ID); set DB(keep=ID Value1 Value2 Value3) point=_n_; total_sum = sum(total_sum, Value1, Value2, Value3); _n_ + 1; end; /* 将指针回退到当前ID的首行,继续处理输出 */ _n_ = _n_ - (last.ID - first.ID + 1); end; /* 首行赋值总和,其余行设为缺失 */ if first.ID then Total = total_sum; else Total = .; output; /* 每个ID处理完后清空总和变量,避免影响下一个ID */ if last.ID then call missing(total_sum); run;
两种方法最终生成的DB1数据集均符合你的目标要求。
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

