You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:50:01