Stata - 在循环中动态定义变量名称

时间:2015-02-03 11:02:46

标签: stata

我对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_1Weight_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'
}

..但它不起作用。

你能帮帮我吗?

1 个答案:

答案 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产生的数据结构更有问题。