我想计算我所在群体中所有成员的平均值,但不包括我自己的平均值。假设组变量被称为group
,我希望val1
取Group
的平均值,不包括我自己。我想要创建的新列是avg
。数据看起来如下(正确的avg
值被输入,这样你就可以看到我的意思了)。
Obs Group val1 avg
1 A 6 8
2 A 8 6
3 B 10 13
4 C 4 4
5 C 2 5
6 C 6 3
7 B 12 12
8 B 14 11
如果我想将自己包括在计算中,那将是直截了当的。我会这样做:
bysort Group: egen avg = mean(val1)
但是我如何用不包括在内的皱纹实现这个呢?
答案 0 :(得分:4)
一种方法是循环所有观察:
clear
set more off
*----- example data -----
input ///
Obs str1 Group val1 avg
1 A 6 8
2 A 8 6
3 B 10 13
4 C 4 4
5 C 2 5
6 C 6 3
7 B 12 12
8 B 14 11
end
list, sepby(Group)
*----- what you want -----
encode Group, gen(group)
gen avg2 = .
forvalues j = 1/`=_N' {
summarize val1 if group == group[`j'] & _n != `j', meanonly
replace avg2 = r(mean) in `j'
}
list, sepby(group)
另一种方法是使用egen
函数:
<snip>
*----- what you want -----
encode Group, gen(group)
bysort group: egen totval = total(val1)
by group: egen cval = count(val1)
generate avg2 = (totval - val1) / (cval - 1)
list, sepby(group)
网上有一篇很好的文章介绍了这个主题:
The Stata Journal(2014) 14,Number 2,pp.432-444, Speaking Stata:Self and others ,by Nicholas J. Cox。