我在SAS中有一个数据集,它有多个缺少数据的列。 This post用零替换整个数据集中的所有缺失值。但是,由于它遍历整个数据集,因此您不能仅使用该列的均值或中位数替换零。如何使用该列的平均值替换缺失的数据?
只有5个左右的列,因此脚本不需要遍历整个数据集。
答案 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;