我有一个变量列表,我想为其创建一个编号变量列表。目的是使用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
值。
答案 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*
,则最明显的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://stackoverflow.com/help/mcve了解如何发布优秀的代码示例。