我有这个问题。 我的数据集包含如下变量:
sec20_var1 sec22_var1 sec30_var1 sec20_var2 sec22_var2 sec30_var2 sec31_var2
(~102个扇区,~60个变量,并非所有的组合都完整或甚至存在)
我的目的是建立一个指标来平均显示行业内的变量。因此,它是一个“聚合部门”,包含属于高中低技术时代的一类部门。我已经有了每个类别中应包含哪些部门的定义。让我们说,在高科技我应该把sec20和sec31。
问题:属于某个类的扇区列表和每个变量可用的实际扇区不匹配。所以我坚持这个问题并开始手动完成。我最好的方法是:
set more off
foreach v in _var02 {
ds *`v'
di "`r(varlist)'"
local sects`v' `r(varlist)'
foreach s in sec26 sec28 sec37 {
capture confirm local sects`v'
if !_rc {
egen oecd_medhigh_avg_`v'=rowmean(`s'`v' sec28`v' sec37`v' sec40`v' sec59`v' sec92`v' sec54`v' sec55`v' sec48`v' sec50`v' sec53`v' sec4`v' sec5`v' sec6`v')
else {
di "`v' didnt existed"
}
}
}
}
我只使用那些在totalrow中存在所有扇区的变量(这更简单,因为我不必将varlist存储在宏中)。我想做一个AVAILABLE扇区的平均值,即使每个变量只有两个。
我还注意到宏存储可能会有所帮助,但我不知道如何将它放入我的代码中。我完全被困在这里了。
感谢您的帮助! :)
答案 0 :(得分:1)
谢谢@SOConnell。正如我在评论中所说,我走向了同一个方向,但我仍然在寻找我期望的解决方案(我不会如何编程,或者即使可能)。
我使用了这个代码,它与@SOConnell制作的代码方向相同,但我发现这个代码更清晰。诀窍是_rc==111
捕获 sector_X_variable 的缺失组合并完成它们,目的是在第二部分中使用。一切正常。它不优雅,但它有一些实际用途。 :)第三部分擦除了创建的缺失变量。
*COMPLETING THE LIST OF COMBINATIONS set more off foreach v in _var02 _var03 _var08 _var13 _... { foreach s in sec27 sec35 sec42 sec43 sec45 sec46 sec39 sec52 sec67 { capture confirm variable
s'
v' if _rc==111 { gens'
v'=. } } } *GENERATING THE INDICATOR WITH ALL POSSIBLE COMBINATIONS set more off foreach v in _var02 _var03 _var08 _var13 ... { egen oecd_high_avg_v'=rowmean(sec27
v' sec35v' sec42
v' sec43v' sec45
v' sec46v' sec39
v' sec52v' sec67
v') } *DROPPING MISSING VARIABLES CREATED TO DO THE INDICATOR. set more off foreach v of varlist * { gen TEMP=. replace TEMP=1 if !missing(v') egen TEMPSUM=sum(TEMP) if TEMPSUM==0 { di " >>> Dropping empty variable:
v'" drop `v' } drop TEMP TEMPSUM }
s'
请注意,我删除了变量列表。
答案 1 :(得分:0)
我会将您所指的变量称为“帐户”。
解决方法是在数据集中为所有sectorXaccount组合创建空变量。从已经将数据集加载到内存中的那一点开始:
forval sec = 1/102 {
forval account = 1/60 {
cap gen sec`sec'_var`account'=. /*this will skip over generating the secXaccount combination if it already exists in the dataset */
}
}
然后将rowmean操作应用于每个指标的完整定义。错误将不会计算到您的rowmean中,因此它实际上将是可用单元格的平均值,而无需您手动进行选择。然后,如果您执行以下操作,则可能会自动删除您创建的空变量:
g start=.
forval sec = 1/102 {
forval account = 1/60 {
cap gen sec`sec'_var`account'=. /*this will skip over generating the secXaccount combination if it already exists in the dataset */
}
}
g end=.
[indicator calculations go here]
drop start-end
然而,似乎你会创建可能无法比较的平均值(有些会有2个基础值,3个,4个等等)所以你需要小心那些(但你可能已经知道了这一点)。