我想知道是否有办法将记录没有排序?#有时候,我想保留原始订单,只想删除重复的记录。
有可能吗?
顺便说一句,以下是我所知道的关于不重复记录的内容,它最终会进行排序..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;
答案 0 :(得分:16)
您可以使用哈希对象来跟踪在通过数据集时看到的值。仅在遇到尚未观察到的密钥时输出。这将按输入数据集中的数据顺序输出。
以下是使用输入数据集“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;
答案 1 :(得分:1)
/* Give each record in the original dataset and row number */ data with_id ; set mydata ; _id = _n_ ; run ; /* Remove dupes */ proc sort data=with_id nodupkey ; by var1 var2 var3 ; run ; /* Sort back into original order */ proc sort data=with_id ; by _id ; run ;
答案 2 :(得分:1)
我认为简短的答案是否定的,没有,至少没有一种方法比基于排序的方法没有更大的性能影响。
可能存在可能的特定情况(所有变量都被编入索引的数据集?一个相对较小的数据集,您可以合理地加载到内存中并在那里工作?)但这对一般方法没有帮助。
Chris J的解决方案可能是获得你所得到的结果的最好方法,但这不是你实际问题的答案。
答案 3 :(得分:0)
根据数据集中的变量数量,以下内容可能是实用的:
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;
答案 4 :(得分:0)
请参阅使用说明37581:如何在不进行排序的情况下消除大型数据集中的重复观察,http://support.sas.com/kb/37/581.html。使用说明37581显示了PROC SUMMARY如何在不使用排序的情况下更有效地删除重复项。
答案 5 :(得分:0)
原帖中给出的两个例子并不相同。
如果你只是在寻找具有共同密钥变量的记录,我能想到的另一个解决方案是创建一个只包含密钥变量的数据集,找出哪个是重复的,然后在原始文件上应用格式标记重复记录的数据。如果数据集中存在多个关键变量,则需要创建一个包含所有关键变量值的串联的新变量 - 如果需要,将转换为字符。
答案 6 :(得分:-1)
这是我能想到的最快的方式。它不需要排序。
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;
答案 7 :(得分:-1)
data output;
set yourdata;
by var notsorted;
if first.var then output;
run;
这不会对数据进行排序,但会删除每个组中的重复项。