如何在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
相关产品推荐
相关产品推荐

