如何解决如何删除重复的记录\\\\观察而无需在SAS中排序?
|| 我想知道是否有一种无需排序就可以消除重复记录的方法吗?有时候,我想保持原始顺序,只想删除重复的记录。 可能吗? 顺便说一句,以下是我所知道的有关重复记录的信息,这些记录最终会进行排序。 1。proc sql;
create table yourdata_nodupe as
select distinct *
From abc;
quit;
2。
proc sort data=YOURDATA nodupkey;
by var1 var2 var3 var4 var5;
run;
解决方法
您可以使用哈希对象来跟踪通过数据集时看到的值。仅当遇到尚未观察到的键时才输出。这将按照在输入数据集中观察到数据的顺序输出。
这是使用输入数据集\“ sashelp.cars \”的示例。原始数据由Make按字母顺序排列,因此您可以看到输出数据集\“ nodupes \”保持相同的顺序。
data nodupes (drop=rc);;
length Make $13.;
declare hash found_keys();
found_keys.definekey(\'Make\');
found_keys.definedone();
do while (not done);
set sashelp.cars end=done;
rc=found_keys.check();
if rc^=0 then do;
rc=found_keys.add();
output;
end;
end;
stop;
run;
proc print data=nodupes;run;
,/ *提供原始数据集中的每条记录和行号* /
数据with_id;
设置mydata;
_id = _n_;
跑 ;
/ *删除骗子* /
proc sort data = with_id nodupkey;
由var1 var2 var3;
跑 ;
/ *按原始顺序排序* /
proc sort data = with_id;
通过_id;
跑 ;
,我认为简短的答案是“否”,没有,至少没有一种方法不会比基于排序的方法具有更大的性能损失。
在某些特定情况下,这是可能的(对所有变量都建立索引的数据集?您可以合理地加载到内存中并在其中使用的相对较小的数据集?),但这对常规方法没有帮助。
克里斯·J(Chris J \)的解决方案可能是获得您所追求的结果的最佳方法,但这并不是您实际问题的答案。
,根据数据集中变量的数量,可能会很实际:
data abc_nodup;
set abc;
retain _var1 _var2 _var3 _var4;
if _n_ eq 1 then output;
else do;
if (var1 eq _var1) and (var2 eq _var2) and
(var3 eq _var3) and (var4 eq _var4)
then delete;
else output;
end;
_var1 = var1;
_var2 = var2;
_var3 = var3;
_var4 = var4;
drop _var:;
run;
,请参考使用说明37581:如何在不进行排序的情况下从大型数据集中消除重复的观察结果,网址为http://support.sas.com/kb/37/581.html。使用说明37581显示了如何在不使用排序的情况下使用PROC Summary更有效地删除重复项。
,原始帖子中给出的两个示例并不相同。
在proc sql中与众不同仅删除完全相同的行
proc sort中的nodupkey删除键变量相同(即使其他变量不相同)的任何行。您需要选项noduprecs删除完全相同的行。
如果您只在寻找具有公共键变量的记录,那么我想到的另一种解决方案是创建一个仅包含键变量的数据集,找出哪个是重复的,然后在原始数据上应用格式以标记重复记录。如果数据集中存在多个关键字变量,则需要创建一个包含所有关键字变量值串联的新变量-必要时转换为字符。
,这是我能想到的最快方法。它不需要排序。
data output_data_name;
set input_data_name (
sortedby = person_id stay
keep =
person_id
stay
... more variables ...);
by person_id stay;
if first.stay > 0 then output;
run;
,data output;
set yourdata;
by var notsorted;
if first.var then output;
run;
这不会对数据进行排序,但是会删除每个组中的重复项。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。