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

如何在SAS中按条件删除变量重复值(仅Index为缺失值时)

解决方案

可以通过SAS的DATA步结合分组处理实现需求,核心思路是:先按ID分组,记录每个ID下各Class变量在Index非缺失行中的非缺失值,再对Index缺失的行,将与已记录值重复的Class变量置为缺失。

步骤1:对原数据集按ID排序

首先确保数据按ID分组有序,方便后续分组处理:

proc sort data=DB;
    by ID;
run;

步骤2:DATA步处理数据

通过数组和retain语句记录每个ID下的Class变量参考值,再对Index缺失的行进行去重处理:

data DB1;
    set DB;
    by ID;
    * 定义数组批量处理Class变量;
    array classes[3] Class1-Class3;
    * 用retain变量存储每个ID下各Class的参考值(来自Index非缺失行);
    retain _ref_c1 _ref_c2 _ref_c3;
    
    * 每个ID组开始时重置参考值;
    if first.ID then do;
        call missing(_ref_c1, _ref_c2, _ref_c3);
    end;
    
    * 处理Index非缺失的行:记录Class变量的非缺失值作为参考;
    if not missing(Index) then do;
        do i = 1 to 3;
            if not missing(classes[i]) then do;
                select(i);
                    when(1) _ref_c1 = classes[i];
                    when(2) _ref_c2 = classes[i];
                    when(3) _ref_c3 = classes[i];
                end;
            end;
        end;
        output; * 直接输出该行;
    end;
    * 处理Index缺失的行:将与参考值重复的Class变量置为缺失;
    else do;
        do i = 1 to 3;
            select(i);
                when(1) if classes[i] = _ref_c1 then classes[i] = .;
                when(2) if classes[i] = _ref_c2 then classes[i] = .;
                when(3) if classes[i] = _ref_c3 then classes[i] = .;
            end;
        end;
        output; * 输出处理后的行;
    end;
    
    * 删除临时变量;
    drop i _ref_c1 _ref_c2 _ref_c3;
run;

代码说明

  • array classes[3] Class1-Class3:将三个Class变量放入数组,实现批量循环处理,避免重复代码。
  • retain _ref_c1 _ref_c2 _ref_c3:保留每个ID组内各Class变量在Index非缺失行中的非缺失值,作为后续去重的参考标准。
  • 分组处理逻辑:
    • 进入新ID组时,重置参考值;
    • 对Index非缺失的行,更新对应Class变量的参考值;
    • 对Index缺失的行,检查每个Class变量是否与参考值重复,重复则置为缺失。

内容的提问来源于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 12:50:12