我希望只使用proc表示给定变量的非零值的均值。 我知道我们可以使用proc sql来计算,但我想通过proc方法或proc摘要来完成它。
在我的研究中,我有8个变量,所以如何根据非零值计算均值,其中我在var语句中使用了所有这些变量,如下所示:
proc means = xyz;
var var1 var2 var3 var4 var5 var6 var7 var8;
run;
如果我们在var语句中一次取一个变量并对非零变量使用where条件,它可以工作,但是我们能否拥有一些适用于var语句中提到的所有感兴趣变量的东西?
您的建议将受到高度赞赏。 谢谢!
答案 0 :(得分:2)
一种方法是将所有零值更改为缺失值,然后使用PROC MEANS
。
data zeromiss /view=zeromiss ; set xyz ; array n{*} var1-var8 ; do i = 1 to dim(n) ; if n{i} = 0 then call missing(n{i}) ; end ; drop i ; run ; proc means data=zeromiss ; var var1-var8 ; run ;
答案 1 :(得分:1)
创建输入数据集的视图。在视图中,为要汇总的每个变量定义权重变量。如果相应的变量为0则将权重设置为0,否则设置为1。然后通过proc means / proc summary进行加权汇总。 E.g。
data xyz_v /view = xyz_v;
set xyz;
array weights {*} weight_var1-weight_var8;
array vars {*} var1-var8;
do i = 1 to dim(vars);
weights[i] = (vars[i] ne 0);
end;
run;
%macro weighted_var(n);
%do i = 1 to &n;
var var&i /weight = weight_var&i;
%end;
%mend weighted_var;
proc means data = xyz_v;
%weighted_var(8);
run;
这不如Chris J针对这个特定问题的解决方案那么优雅,但是对于你想在同一个摘要中对不同变量应用不同权重的其他情况,它会稍微好一点。
答案 2 :(得分:-1)
你不能使用data
声明吗?
data lala;
set xyz;
drop qty;
mean = 0;
qty = 0;
if(not missing(var1) and var1 ^= 0) then do;
mean + var1;
qty + 1;
end;
if(not missing(var2) and var2 ^= 0) then do;
mean + var2;
qty + 1;
end;
/* ... repeat to all variables ... */
if(not missing(var8) and var8 ^= 0) then do;
mean + var8;
qty + 1;
end;
mean = mean/qty;
run;
如果您希望将平均值保留在同一xyz
数据集中,只需将lala
替换为xyz
。