2016-11-17 25 views
0

我有一个变量列表,我想创建一个编号变量列表。意图是通过reshape命令使用这些命令来创建堆叠数据集。我如何保持它们的秩序?例如,对于这个代码使用foreach命令创建编号的变量名称

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

我编辑你的本地宏显示(和其他文本:保持简洁并承担善意)。使用缩进语法显示,只要使用反引号与显示Stata本地宏引用的文字反引号冲突。 (还有另一种解决方案,以避免反引号,但缩进在这里更容易工作。) –

回答

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,则复制内容的劳动是不必要的。实际上,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://stackoverflow.com/help/mcve

+0

尼克,我没有想到数字格式。这很好。谢谢。我确实在寻找解决方案,但没有发现。关于重塑的投诉,我没有。它做它应该做的。非常感谢! – Steve

+1

注意。应该补充的是,如果你坚持使用一些(或全部)前导零的后缀,你需要''reshape'的'string'选项来保存它们! –

+0

谢谢尼克! – Steve