我试图找到同一组中所有其他观测值的平均值。
我的数据就像
Value Name Group Mean_all_other
544 Pete 1 ....
997 Sara 1 ....
772 Tom 1 ....
725 Tris 2 ....
872 Lulu 2 ....
434 Mica 2 ....
728 Tina 2 ....
827 Bo 3 ....
322 Zu 3 ....
..... ... ... ...
我知道proc means
可以给你群体内的平均值。但是在这里,我想创建同一组中所有其他值的平均值。
在这种情况下,皮特在 Mean_all_other 下将显示 884.5,等于 (997+772)/2。
萨拉= (544+772)/2=658; Tris=(872+434+728)/3=678
有人知道吗?
考虑一个proc sql
解决方案,使用子查询对每一行平均相同的Group
,并调节当前Name
。下面的查询使用 SAS 的不相等运算符^=
和mean()
函数,在常规 SQL 中将使用<>
运算符和 avg()
- 两者都在 SAS 中仍然兼容)。
proc sql;
create table NewTable as
select * from
(select main.Value, main.Name, main.Group,
(select mean(sub.Value)
from CurrentTable sub
where sub.Group = main.Group
and sub.Name ^= main.Name) As Mean_all_other
from CurrentTable as main)
quit;
* Value Name Group Mean_all_other
* 544 Pete 1 884.5
* 997 Sara 1 658
* 772 Tom 1 770.5
* 725 Tris 2 678
* 872 Lulu 2 629
* 434 Mica 2 775
* 728 Tina 2 677
* 827 Bo 3 322
* 322 Zu 3 827
获得每个整组的均值后,每个观测值的案例删除均值就更容易计算。我建议通过双道琼斯循环来做到这一点:
data have;
input Value Name $ Group;
cards;
544 Pete 1
997 Sara 1
772 Tom 1
725 Tris 2
872 Lulu 2
434 Mica 2
728 Tina 2
827 Bo 3
322 Zu 3
;
run;
data want;
do _N_ = 1 by 1 until(last.group);
set have;
by group;
value_sum = sum(value_sum,value);
value_count = sum(value_count,1);
end;
do _N_ = 1 to _N_;
set have;
mean_all_other = (value_sum - value)/(value_count - 1);
output;
end;
drop value_:;
run;
PROC SQL将很乐意为您重新合并摘要统计信息。 请注意,此语法在其他 SQL 实现中可能不起作用,但在 SAS 中工作正常。您可以使用 DIVIDE
函数来避免只有一个成员的组被零除。
create table want as
select *
, divide(sum(value) - value, n(value) - 1) as mean_all_other
from have
group by group
;
对于其他 SQL 实现,您需要自己重新合并聚合结果。
create table want as
select a.*
, divide(b.sum_value - a.value, b.n_value - 1) as mean_all_other
from have a
, (select group,sum(value) as sum_value,n(value) as n_value
from have
group by group
) b
where a.group = b.group
;
如果可能缺少 VALUE
的值,则需要添加 CASE
语句来处理这些情况。
create table want as
select *
, case when (missing(value)) then mean(value)
else divide(sum(value) - value, n(value) - 1)
end as mean_all_other
from have
group by group
;