使用 foreach 命令创建带编号的变量名称
Creating numbered variable names using the foreach command
我有一个变量列表,我想为其创建一个编号变量列表。目的是将这些与 reshape
命令一起使用来创建堆叠数据集。我如何让它们井井有条?例如,使用此代码
local ct = 1
foreach x in q61 q77 q99 q121 q143 q165 q187 q209 q231 q253 q275 q297 q306 q315 q324 q333 q342 q351 q360 q369 q378 q387 q396 q405 q414 q423 {
gen runs`ct' = `x'
local ct = `ct' + 1
}
当我使用 reshape
命令时,它生成一个订单
runs1 runs10 runs11 ... runs2 runs22 ...
而不是想要的
runs01 runs02 runs03 ... runs26
在此分析中需要保留顺序。在分配变量名时,我试图为所有小于 10 的 ct
值添加一个前导零。
生成一系列带有前导零的标识符是一个记录在案并已解决的问题:参见例如here。
local j = 1
foreach v in q61 q77 q99 q121 q143 q165 q187 q209 q231 q253 q275 q297 q306 q315 q324 q333 q342 q351 q360 q369 q378 q387 q396 q405 q414 q423 {
local J : di %02.0f `j'
rename `v' runs`J'
local ++j
}
请注意,我使用的是 rename
而不是 generate
。如果之后要 reshape
变量,则不需要复制内容的劳动。事实上,generate
使用的数字变量的默认 float
类型在某些情况下可能会导致精度损失。
我注意到 rename groups
也可能有一个解决方案。
综上所述,很难理解您对 reshape
做什么(或不做什么)的抱怨。如果您有一系列变量,例如 runs*
,最明显的 reshape
是 reshape long
,例如
clear
set obs 1
gen id = _n
foreach v in q61 q77 q99 q121 q143 {
gen `v' = 42
}
reshape long q, i(id) j(which)
list
+-----------------+
| id which q |
|-----------------|
1. | 1 61 42 |
2. | 1 77 42 |
3. | 1 99 42 |
4. | 1 121 42 |
5. | 1 143 42 |
+-----------------+
对我来说很好用;保留了列顺序信息,根本不需要使用 rename
。如果我想将后缀映射到 1,我可以只使用 egen, group()
。
所以,如果没有可重现的例子,这很难讨论。看
https://whosebug.com/help/mcve 如何 post 好的代码示例。
我有一个变量列表,我想为其创建一个编号变量列表。目的是将这些与 reshape
命令一起使用来创建堆叠数据集。我如何让它们井井有条?例如,使用此代码
local ct = 1
foreach x in q61 q77 q99 q121 q143 q165 q187 q209 q231 q253 q275 q297 q306 q315 q324 q333 q342 q351 q360 q369 q378 q387 q396 q405 q414 q423 {
gen runs`ct' = `x'
local ct = `ct' + 1
}
当我使用 reshape
命令时,它生成一个订单
runs1 runs10 runs11 ... runs2 runs22 ...
而不是想要的
runs01 runs02 runs03 ... runs26
在此分析中需要保留顺序。在分配变量名时,我试图为所有小于 10 的 ct
值添加一个前导零。
生成一系列带有前导零的标识符是一个记录在案并已解决的问题:参见例如here。
local j = 1
foreach v in q61 q77 q99 q121 q143 q165 q187 q209 q231 q253 q275 q297 q306 q315 q324 q333 q342 q351 q360 q369 q378 q387 q396 q405 q414 q423 {
local J : di %02.0f `j'
rename `v' runs`J'
local ++j
}
请注意,我使用的是 rename
而不是 generate
。如果之后要 reshape
变量,则不需要复制内容的劳动。事实上,generate
使用的数字变量的默认 float
类型在某些情况下可能会导致精度损失。
我注意到 rename groups
也可能有一个解决方案。
综上所述,很难理解您对 reshape
做什么(或不做什么)的抱怨。如果您有一系列变量,例如 runs*
,最明显的 reshape
是 reshape long
,例如
clear
set obs 1
gen id = _n
foreach v in q61 q77 q99 q121 q143 {
gen `v' = 42
}
reshape long q, i(id) j(which)
list
+-----------------+
| id which q |
|-----------------|
1. | 1 61 42 |
2. | 1 77 42 |
3. | 1 99 42 |
4. | 1 121 42 |
5. | 1 143 42 |
+-----------------+
对我来说很好用;保留了列顺序信息,根本不需要使用 rename
。如果我想将后缀映射到 1,我可以只使用 egen, group()
。
所以,如果没有可重现的例子,这很难讨论。看 https://whosebug.com/help/mcve 如何 post 好的代码示例。