我需要从数据集中删除重复项。我的问题是,一旦我对数据进行排序并标记重复项(使用滞后函数),变量中的一些信息存在于重复观察中,一些信息存在于原始观察中。我需要保留所有变量的信息,同时删除重复项。
我的想法是在删除副本之前先填写原件和副本之间的所有信息。
排序数据和标记重复项(伪数据值)后的观察示例:
Province AGE BRTHYEAR Trans_id Morb_id VarX flag_duplicate
AB 36 1980 45654 . . 0
AB 36 1980 . . 2135 1
ON 26 1990 . . 8868 0
ON 26 1990 . 35464 8868 1
我想要的是什么:
Province AGE BRTHYEAR Trans_id Morb_id VarX flag_duplicate
AB 36 1980 45654 . 2135 0
AB 36 1980 45654 . 2135 1
ON 26 1990 . 35464 8868 0
ON 26 1990 . 35464 8868 1
所以我可以删除重复项并最终拥有:
Province AGE BRTHYEAR Trans_id Morb_id VarX flag_duplicate
AB 36 1980 45654 . 2135 0
ON 26 1990 . 35464 8868 0
我创建了滞后和引导变量来尝试填充信息,但它似乎只是在处理某些数据集。
以下是主要变量的代码:
data uncleaned_data;
merge uncleaned_data
uncleaned_data(
firstobs=2
keep= TRANS_ID MORB_ID Varx
rename=(TRANS_ID=lead_TRANS_ID MORB_ID=lead_MORB_ID Varx=lead_Varx ));
if lag(flag_duplicate=1) then do;
if TRANS_ID=. then do;
TRANS_ID= lead_TRANS_ID;
end;
if MORB_ID=. then do;
MORB_ID= lead_MORB_ID;
end;
if Varx=. then do;
Varx= lead_Varx;
end;
end;
run;
我为滞后变量做了同样的事情,除了我的初始if语句是'if flag_duplicate = 1然后做;'
此方法似乎不适用于我的数据集中的许多重复对。
有没有更好的方法来解决我的整体问题?可能通过proc SQL?
感谢阅读和提供的任何建议!
答案 0 :(得分:1)
我假设您没有不同的Trans_id值,例如,对于同一个省。如果是这种情况,那么您可以使用带有update
语句的by
语句一次展平原始数据以实现目标。在我的代码中,对数据集的第一次引用(obs=0
)只创建变量,第二次引用填充值,by
语句确保每个普罗维登斯只更新一行。
使用此方法意味着您无需事先识别重复值。
data have;
input Province $ AGE BRTHYEAR Trans_id Morb_id VarX flag_duplicate;
datalines;
AB 36 1980 45654 . . 0
AB 36 1980 . . 2135 1
ON 26 1990 . . 8868 0
ON 26 1990 . 35464 8868 1
;
run;
data want;
update have(obs=0) have;
by province;
run;
答案 1 :(得分:0)
这样的事情应该有用......
proc sort data=uncleaned_data; by Province AGE BRTHYEAR; run;
data cleaned_data (DROP=TRANS_ID RENAME=(KEEP_TRANS_ID=TRANS_ID) ...);
set uncleaned_data;
by Province AGE BRTHYEAR;
if first.BRTHYEAR then do;
keep_TRANS_ID=TRANS_ID;
...
end;
else do;
if keep_TRANS_ID=. then keep_TRANS_ID=TRANS_ID;
...
end;
if last.BRTHYEAR then output;
run;