用SAS中的列平均值替换缺失值

时间:2016-07-07 13:47:17

标签: sas

我在SAS中有一个数据集,它有多个缺少数据的列。 This post用零替换整个数据集中的所有缺失值。但是,由于它遍历整个数据集,因此您不能仅使用该列的均值或中位数替换零。如何使用该列的平均值替换缺失的数据?

只有5个左右的列,因此脚本不需要遍历整个数据集。

3 个答案:

答案 0 :(得分:2)

PROC STDIZE可以选择这样做。 REPONLY选项告诉您希望它只替换缺失值,METHOD=MEAN告诉它如何替换这些值。 (PROC EXPAND也可以使用,如果您使用的是时间序列数据,但如果您只是使用均值,STDIZE就更简单了。)

例如:

data missing_class;
  set sashelp.class;
  if _N_=5 then call missing(age);
  if _N_=7 then call missing(height);
  if _N_=9 then call missing(weight);
run;

proc stdize data=missing_class out=imputed_class
            method=mean reponly;
    var age height weight;
run;

答案 1 :(得分:0)

您可以使用proc sql中的mean函数仅替换每列中缺少的观察值:

data temp;
   input var1 var2 var3 var4 var5;
   datalines;
    . 2 3 4 .
    6 7 8 9 10
    . 12 . . 15
    16 17 18 19 .
    21 . 23 24 25
    ;
run;

proc sql;
    create table temp2 as select
        case when missing(var1) then mean(var1) else var1 end as var1,
        case when missing(var2) then mean(var2) else var2 end as var2,
        case when missing(var3) then mean(var3) else var3 end as var3,
        case when missing(var4) then mean(var4) else var4 end as var4,
        case when missing(var5) then mean(var5) else var5 end as var5
        from temp;
quit;

而且,正如Joe所提到的,如果你更喜欢这种语法,你可以使用coalesce:

coalesce(var1, mean(var1)) as var1

答案 2 :(得分:0)

理想情况下,您可能希望使用PROC MI进行多次插补并获得更准确的缺失值表示;但是,如果您希望使用平均值,则可以使用PROC MEANS和数据步骤来完成替代方法。

/* Set up data */
data have(index=(sex) );
    set sashelp.class;

    if(_N_ IN(3,7,9,12) ) then call missing(height);
run;

/* Calculate mean of all non-missing values */
proc means data=have noprint;
    by sex;
    output out=means mean(height) = imp_height;
run;

/* Merge avg. values with original data */
data want;
    merge have
          means;
    by sex;

    if(missing(height) ) then height = imp_height;

    drop imp_height;
run;