【问题标题】:Replacing Missing Value with non-missing in the same dataset将缺失值替换为同一数据集中的非缺失值
【发布时间】:2017-02-15 06:25:16
【问题描述】:

我对以下问题有疑问。我的数据如下所示:

State Total
AZ    1000
AZ    1000
AZ    -
CA    -
CA    4000

也就是说,对于某些观察,我缺少变量“total”的数据。我想用非缺失观测值的总数替换缺失值。

期望的输出

enter code here
State Total
AZ    1000
AZ    1000
AZ    **1000**
CA    **4000**
CA    4000

有什么想法吗?

【问题讨论】:

    标签: replace sas missing-data


    【解决方案1】:

    如果您的值是常量,请使用 PROC STANDARDIZE 替换缺失值。

    Proc stdize data=have out=want missing=mean reponly;
    By state;
    Var amount;
    Run;
    

    【讨论】:

    • 小注:replace和reponly都是不允许的。删除替换,这很好用。
    【解决方案2】:

    这是我想出的解决方案。当然有更优雅的方法可以做到这一点,但这已经过测试并且有效。

    想法是对数据进行排序,以便缺失值在正确的值之后。然后循环每个状态。保存第一次观察中的“总”值,并将其应用于状态中任何缺失的单元格。

    data begin;
        length state $3 total 5;
        input state Total;
        cards;
        AZ    1000 @@
        AZ    1000 @@
        AZ     @@
        CA     @@
        CA    4000 @@
        OZ @@
        OZ    3000 @@
        OZ @@
        ;
    run;
    
    proc sort data=begin; by state descending total ; run;
    
    data Filled;
        set begin;
        by state; /*Handle each state as own subset*/
        retain memory; /*Keeps the 'memory' from prior observations and not from column */
        if first.state then memory=total; /*Save the value to temporary column*/
        if total=. then total=memory; /*Fill blanks*/
    
        drop memory; /*Cleanup*/
    run;
    

    【讨论】:

      【解决方案3】:

      用均值归并。

      proc sql;
         select a.state,coalesce(a.total,b.total) from have a left join (select distinct state,mean(total) as total from have group by state) b on a.state=b.state;
      quit; 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        • 2018-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-04
        相关资源
        最近更新 更多