sas - 仅在没有新信息时保留重复 ID
问题描述
我想保留所有重复的 ID,除非由于缺少值而没有新信息。例如,
data test;
input id var1 var2 var3
datalines;
1 2 3 4
1 4 . 4
1 6 5 4
1 . 3 .
1 2 4 4
1 6 . 4
1 . 8 4
;
run;
我希望结果是
1 2 3 4
1 4 . 4
1 6 5 4
1 2 4 4
1 . 8 4
第 4 行被删除,因为第 1 行具有相同的 id、var2 和 var3。第 6 行被删除,因为第 3 行具有相同的 id、var1、var3。我还想要一个强大的解决方案,因为我希望该解决方案适用于数据集中的任意数量的变量(id 始终是唯一键)。
有什么想法吗?我在考虑 sort nodupkey 但如果连续有多个缺失值,它就不起作用。
解决方案
您可以提取缺少一个或多个的行。在第二步中,您必须生成 RegExp,它可以帮助您识别相似的行。
您的建议可能会改进代码。
data test;
input id var1 var2 var3;
datalines;
1 2 3 4
1 4 . 4
1 6 5 4
1 . 3 .
1 2 4 4
1 6 . 4
1 . 8 4
;
run;
data test2 missing;
/*incrase this strings if you have big values*/
length res $ 200 addedEl $ 10;
set test;
array num _NUMERIC_;
/*add flag to determine is there missin in row*/
flag=0;
do i=1 to dim(num);
addedEl=compress(put(num(i),8.));
if num(i)=. then
do;
flag=1;
/*template for number. If you have comma separated vars then replace on \d+\.\d* */
addedEl="\d+";
end;
/*add delimeter to row parse, if you have more than one digits in vars =)*/
res=catx("_",res,addedEl);
end;
if flag=0 then output test2;
else do;
res=catt("/",res,"/");
output missing;
end;
drop i flag addedEl;
run;
/*determine rows that dublicates*/
proc sql noprint;
create table matched as
select B.*
,prxparse(B.res) as prxm
,A.*
from test2 as A
,missing as B
where prxmatch(calculated prxm,A.res)
order by B.res;
quit;
run;
/*pre-merge sort*/
proc sort data=missing;
by res;
run;
/*delete rows that are in second dataset*/
data miss_correctred;
merge missing(in=mss)
matched(in=mtch)
;
by res;
if mss=1 and mtch=0;
run;
data test_res(drop=prxm res);
set test2 miss_correctred;
run;
结果:
+----+------+------+------+
| id | var1 | var2 | var3 |
+----+------+------+------+
| 1 | 2 | 3 | 4 |
| 1 | 6 | 5 | 4 |
| 1 | 2 | 4 | 4 |
| 1 | 4 | . | 4 |
| 1 | . | 8 | 4 |
+----+------+------+------+
推荐阅读
- javascript - 防止视频源更改时跳转到第一帧
- c# - WPF - 复选框命令未触发
- c# - 使用参数将 xaml 页面加载为框架的源
- javascript - 反应中的单个自定义标记谷歌地图 API
- javascript - 如何将画布像素值减一
- python - 为什么这两个数组是一样的?
- javascript - 我想通过反应上下文状态管理从我的反应项目中的表单设置用户名,但它保持未定义
- javascript - Promise.all 实际上在幕后做了什么?
- html - Divs 相互修复
- kubernetes - 拒绝请求:拒绝准入审查,因为该请求不包含 Ingress 资源,但 network.k8s.io/v1