假设我有一堆农场数据,以作物水平报告(即为每种作物提供数据)。
每个作物观察属于特定的领域,每个领域属于特定的农场。 (字段和服务器场标识变量包含在数据集中。)
在Stata中,我想将裁剪级别数据汇总到字段级别,然后将字段级别数据汇总到场级别。
因此,对于变量x,从作物到字段级别聚合的基本命令是:
egen x_field = total(x_crop),by(farm,field)
然后汇总到农场级别:
egen x_farm = total(x_field),by(farm)
我需要聚合很多变量,所以我想使用foreach循环,而不是为每个后缀“_field”,“_ farm”重复相同的代码。如果有人能帮助我,我将不胜感激。
答案 0 :(得分:1)
假设您的egen
命令是执行所需操作的最佳方式:
foreach x of varlist var1-var99 {
di "Processing variable `x'"
egen `x'_field = total(`x'_crop), by(farm field)
egen `x'_farm = total(`x'_field), by(farm)
}
循环将覆盖var1
到var99
范围内的每个变量。如果您想以更复杂的方式定义varlist
,请查看变量列表的Stata帮助。
编辑:by()
字段中不应包含逗号(感谢Nick)。
答案 1 :(得分:0)
我认为Fr.的解决方案效果很好,但这是另一种解决方案。两者都可能非常快,但这种方法不需要显式循环,但内部Stata可能使用一个。
renvars
来自SJ(即findit renvars
),此功能是Stata 12 +中rename
的一部分。
sysuse auto, clear
order rep78 foreign make price
* by one category
tempfile auto_r
preserve
collapse (sum) price-gear_ratio, by(rep78)
renvars price-gear_ratio, postfix(_r)
save `auto_r'
restore
* by two categories
tempfile auto_rf
preserve
collapse (sum) price-gear_ratio, by(rep78 foreign)
renvars price-gear_ratio, postfix(_rf)
save `auto_rf'
restore
* merge back
merge m:1 rep78 using `auto_r', generate(merge_r)
merge m:1 rep78 foreign using `auto_rf', generate(merge_rf)
答案 2 :(得分:0)
如果我理解正确,则无需聚合分为两个阶段。您只需根据服务器场标识符聚合每个裁剪。
类比将是对美国各州内县内人们的观察。如果您想要州总计,则只需要by(state)
。要想看到这个,想象一下你扔掉县标识符。您没有丢弃任何所需的信息。
在任何情况下,请注意egen
的{{1}}功能,该功能旨在标记组中的一个且仅一个观察。