如何使用proc均值或proc摘要计算非零值的均值

时间:2014-09-19 06:56:19

标签: sas average mean

我希望只使用proc表示给定变量的非零值的均值。 我知道我们可以使用proc sql来计算,但我想通过proc方法或proc摘要来完成它。

在我的研究中,我有8个变量,所以如何根据非零值计算均值,其中我在var语句中使用了所有这些变量,如下所示:

proc means = xyz;
var var1 var2 var3 var4 var5 var6 var7 var8;
run; 

如果我们在var语句中一次取一个变量并对非零变量使用where条件,它可以工作,但是我们能否拥有一些适用于var语句中提到的所有感兴趣变量的东西?

您的建议将受到高度赞赏。 谢谢!

3 个答案:

答案 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