SAS:通过对不包括观察的变量进行分组来计算平均值

时间:2015-10-30 19:53:04

标签: sql sas

提前感谢您提供的所有帮助。

下面链接了一个示例数据集和所需的输出。

我想从“Have”数据集计算新变量,如下所示: RE:给定“Cat”变量值内的“R”值的平均值,不包括特定观察值 IE是给定“Cat”变量值中“I”响应的平均值,不包括特定观察值

enter image description here

2 个答案:

答案 0 :(得分:1)

你可以通过加入值和一些算术来做到这一点:

proc sql;
    select t.*,
           (sumr - r) / (cnt - 1) as re,
           (sumi - i) / (cnt - 1) as ie
    from t left join
         (select cat, count(*) as cnt, sum(r) as sumr, sum(i) as sumi
          from t
          group by cat
          having count(*) > 1
         ) tt
         on t.cat = tt.cat;

请注意,我使用left joinhaving子句来防止除以零。

答案 1 :(得分:0)

多谢你们,左边的连接有效,但可能会出现丢失数据的问题。因此,这似乎是最好的解决方案(感谢SAS社区上的PGStats):

proc sql; 创建表想要 选择 *,     (sum(R)-coalesce(R,0))/(count(R)-1 + missing(R))作为RE,     (sum(I)-coalesce(I,0))/(count(I)-1 + missing(I))as IE 从有 CAT组 按ID,CAT排序; 退出;

PGStats查询通过以下方式处理缺失值:

SUM和COUNT聚合函数仅对非缺失值进行操作。 当缺少R或I值时,除了该特定观察值之外的平均值仍然从同一CAT组中的其他值计算。 如果R或I值是其CAT组中唯一的非缺失值,则排除该特定观察值的平均值将设置为缺失。 当CAT组中缺少所有R或I值时,平均值将设置为缺失。