Replace 将同一数据集中的缺失值替换为非缺失值

Replace 将同一数据集中的缺失值替换为非缺失值,replace,sas,missing-data,Replace,Sas,Missing Data,我有一个关于以下问题的问题。我有如下数据: 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 有什么想法吗?这是我想出的一个解决方案。当然

我有一个关于以下问题的问题。我有如下数据:

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

有什么想法吗?

这是我想出的一个解决方案。当然有更优雅的方法可以做到这一点,但这是经过测试和工作

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

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;

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

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

合并以平均数插补

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; 

小提示:不允许同时更换和重新安装。放下替换件,这样做效果很好。