使用foreach命令创建编号的变量名

时间:2016-11-17 20:41:53

标签: foreach stata variable-names

我有一个变量列表,我想为其创建一个编号变量列表。目的是使用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值。

1 个答案:

答案 0 :(得分:2)

生成一系列带前导零的标识符是一个记录在案且已解决的问题:请参阅例如: 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变量,则无需复制内容。实际上,float使用的数值变量的默认generate类型在某些情况下会导致精度损失。

我注意到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://stackoverflow.com/help/mcve了解如何发布优秀的代码示例。