提前感谢您提供的所有帮助。
下面链接了一个示例数据集和所需的输出。
我想从“Have”数据集计算新变量,如下所示: RE:给定“Cat”变量值内的“R”值的平均值,不包括特定观察值 IE是给定“Cat”变量值中“I”响应的平均值,不包括特定观察值
答案 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 join
和having
子句来防止除以零。
答案 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值时,平均值将设置为缺失。