我对Stata编程很陌生。
我的问题:我需要通过(我猜)宏来重新排序/重塑数据集。
我有个人数据集,变量birthyear
' (出生年份)和每个在给定的CALENDAR年份都包含重量的变量:例如
BIRTHYEAR | W_1990 | W_1991 | W_1992 | ... | w_2000
1989 | 7.2 | 9.3 | 10.2 | ... | 35.2
1981 | 33.2 | 35.3 | ...
我想获得包含不同年龄体重的新变量,例如: Weight_age_1
,Weight_age_2
等:这意味着以第一个例子为例,将Weight_age_1
留空,将{7.2}放入Weight_age_2
,依此类推。
我尝试过像......
forvalues i = 1/10{
capture drop weight_age_`i'
capture drop birth`i
gen birth_`i'=birthyear-1+`i'
tostring birth_`i', replace
gen weight_age_`i'= w_birth_`i'
}
..但它不起作用。
你能帮帮我吗?
答案 0 :(得分:3)
有经验的Stata用户不会尝试在这里编写自包含的程序:他们会发现问题的核心是reshape
。
clear
input birthyear w_1990 w_1991 w_1992
1989 7.2 9.3 10.2
1981 33.2 35.3 37.6
end
gen id = _n
reshape long w_, i(id)
rename _j year
gen age = year - birthyear
l, sepby(id)
+-----------------------------------+
| id year birthy~r w_ age |
|-----------------------------------|
1. | 1 1990 1989 7.2 1 |
2. | 1 1991 1989 9.3 2 |
3. | 1 1992 1989 10.2 3 |
|-----------------------------------|
4. | 2 1990 1981 33.2 9 |
5. | 2 1991 1981 35.3 10 |
6. | 2 1992 1981 37.6 11 |
+-----------------------------------+
要获得您想要的变量,您可以reshape wide
,但此long
结构是为了将来的Stata工作而存储这些数据的更方便的方法。
P.S。编程问题的核心在于您对变量名称及其内容感到困惑。
但这是一种“查找”方法:
clear
input birthyear w_1990 w_1991 w_1992
1989 7.2 9.3 10.2
1981 33.2 35.3 37.6
end
quietly forval j = 1/10 {
gen weight_`j' = .
forval k = 1990/1992 {
replace weight_`j' = w_`k' if (`k' - birthyear) == `j'
}
}
基本技巧是使用本地宏进行名称操作。在Stata中,变量主要用于保存数据;单值常量更好地保存在本地宏和标量中。 (您对“宏”这个词的含义是脚本或程序的含义,而不是Stata中使用该术语的方式。)
如上所述:这是您要求的数据结构,但它可能比reshape long
产生的数据结构更有问题。