2014-09-19 76 views
1

我希望使用proc方法只对给定变量具有基于非零值的平均值。 我知道我们可以使用proc sql来计算,但我想通过proc方法或proc摘要来完成它。如何使用proc平均值或proc概要计算非零值的平均值

在我的研究中,我有8个变量,所以我怎么能计算基于非零值意味着凡在我使用所有这些在下面var声明:

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

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

您的建议将不胜感激。 谢谢!

+0

您可以使用宏。顺便说一句,上面的语法是错误的,你必须在等号(“=”)符号前添加“数据”关键字。 – PKumar 2014-09-19 07:21:30

回答

-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数据集,只是xyz取代lala

+0

''='和'+ ='不是SAS datastep操作符,它们应该分别是'^ ='和'+'。 另外,做'var1!= 0'将包含缺失值,因此会偏离均值。使用'if not missing(var1)and var1^= 0'来代替。 – 2014-09-19 07:45:28

+0

谢谢 - 我承认我的SAS语法有点生疏。将解决它! :) – 2014-09-19 08:21:48

1

创建您的输入数据集视图。在视图中,为每个要汇总的变量定义一个权重变量。如果相应变量为0,则将权重设置为0,否则将权重设置为1。然后通过proc means/proc摘要进行加权汇总。例如。

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; 

这比克里斯·J的这一特定问题的解决方案不太优雅,但它可以推广稍微好一点的地方,你想在同一总结不同的权重应用于不同变量的其他情形。

+0

'vars [i]'的负值怎么样? – 2014-09-19 08:23:55

+0

好点 - 固定! – user667489 2014-09-19 22:22:21

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 ;