使用 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*,最明显的 reshapereshape 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 好的代码示例。