SAS:处理重复项而不会丢失可变信息

时间:2016-06-22 14:48:28

标签: sas duplicates

我需要从数据集中删除重复项。我的问题是,一旦我对数据进行排序并标记重复项(使用滞后函数),变量中的一些信息存在于重复观察中,一些信息存在于原始观察中。我需要保留所有变量的信息,同时删除重复项。

我的想法是在删除副本之前先填写原件和副本之间的所有信息。

排序数据和标记重复项(伪数据值)后的观察示例:

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?

感谢阅读和提供的任何建议!

2 个答案:

答案 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;