【问题标题】:SAS: Dealing with duplicates without losing variable informationSAS:处理重复而不丢失变量信息
【发布时间】:2016-06-22 14:48:28
【问题描述】:

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

我的想法是在删除重复之前先填写原始和重复之间的所有信息。

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

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 then do;'

此方法似乎不适用于我的数据集中的许多重复对。

有没有更好的方法来解决我的问题?可能通过proc SQL?

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

【问题讨论】:

    标签: sas duplicates


    【解决方案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;
    

    【讨论】:

    • 感谢@Keith 的回复。实际上有 35,000 多个 obs,trans_id 和 morb_id 是每个患者的唯一标识符(每个 obs 将只有两者中的一个,但有时会同时丢失两者)。在对数据进行排序(按 10 个变量排序)后,我根据它们是否与每个排序变量的相应滞后值匹配来标记重复项。
    • @ASilva 那么您需要做的就是将您排序的10个变量放入我编写的数据步骤中的by语句中。这应该会给你想要的结果。
    【解决方案2】:

    这样的东西应该可以工作......

    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;
    

    【讨论】:

    • 嗨!谢谢回复。我会尝试这个,但我想知道如果我有 35,000 多个观察结果并且许多 obs 具有相同的出生年份,它是否仍然有效。我的重复标志代码基于 10 个与相应滞后变量值相同的变量值(我给出了数据集的简化示例)。
    • 是的,first.BRTHYEAR 只是在它是子组中的第一个观察值时发生变化,在这种情况下是每个个体。
    • 这似乎对我不起作用。未填写原始或重复观察中缺失值的信息。不过还是谢谢你的建议。
    • @ASilva - 如果是数字字段,请尝试 =. 而不是 =""。另外,我进行了编辑以包含输出行。
    猜你喜欢
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2023-03-21
    • 2018-03-19
    相关资源
    最近更新 更多