gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:20:46 24 4
gpt4 key购买 nike

我是 Stata 编程的新手。

我的问题:我需要通过(我猜)一个宏来重新排序/ reshape 数据集。

我有一个个人数据集,其中有一个变量 birthyear'(出生年份),每个变量都包含给定日历年的体重:例如

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等:这意味着以第一个obs为例,将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'
}

.. 但它不起作用。

你能帮帮我吗?

最佳答案

有经验的 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 工作使用的更方便的方式.

附言你的编程问题的核心是你在变量名和它们的内容之间感到困惑。

但这是一种“查找”方法:

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 产生的问题更多。

关于Stata - 在循环中动态定义变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28297292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com