2017-06-12 94 views
0

此问题已被编辑为添加示例数据和清理(希望)每个反馈的一些不必要的步骤。Stata宏列表uniq扩展函数(删除宏var列表中的重复项)

我从广泛的纵向数据开始。我需要对多个不同的数据块进行子集,重塑和执行摘要步骤。我想创建宏变量与varlists需要重整和其他重复步骤在宽和长格式。正在重塑的变量遵循(prefix)_(name)_#的一致命名模式。还有一些变量遵循相同的模式,不需要进行重构,以及时间不变的变量,并遵循其他命名约定。要生成样本数据:

set obs 1 
foreach t in 0 6 15 18 21 { 
foreach w in score postint postintc constime starttime { 
     gen p_`w'_`t' = 1 
    } 
} 
gen p_miles_0 = 1 
gen p_hea_0 = 1 
gen cons_age = 1 

ds 

我要创建两个宏瓦尔1)wide_varlist对于其中变量的数字结束宽幅数据和2)uniquestubs长格式数据,其中宏列表只包含存根。我在使用宏列表扩展函数“uniq”在这里生成#2时遇到了问题。这是我的代码到目前为止。我的全部varlists实际上更长。

步骤来创建宏与宽幅varlist中:

/* create varlist for wide format data a time point 0,6,15,18,21 */ 
ds p_score_* p_postint_* p_postintc_* p_constime_* p_starttime_* 
di "`r(varlist)'" 
global wide_varlist `r(varlist)' 

开始的步骤与长格式varlist中创建的宏:

/*copy in wide format varlist*/ 
global stubs "$wide_varlist" 

/*remove # - this results in a macro with 5 dups of same stub*/ 
foreach mo of numlist 0,6,15,18,21{ 
    global stubs : subinstr global stubs "`mo'" "", all 
} 

/*keep unique stubs*/ 
global uniquestubs : list uniq stubs 

上面的一切作品,我打算到global uniquestubs : list uniq stubs,这不完全可以创建宏uniquestubs

我的情况与此似乎相似this question但同样的解决方案对我无效。

有什么想法?感谢帮助。

回答

1

这是有点难以遵循你想要做的事情(a)没有一个可重复的例子(b),因为你的很多代码只是将相同的varlist复制到不同的地方,这是一个分心。

我们可以通过创建一个玩具数据集修复(一):

clear 
set obs 1 
foreach t in 0 6 15 18 21 { 
    foreach w in score postint postintc constime starttime { 
     gen p_`w'_`t' = 1 
    } 
} 

ds 
p_score_0  p_score_6  p_score_15 p_score_18 p_score_21 
p_postint_0 p_postint_6 p_postint_15 p_postint_18 p_postint_21 
p_postintc_0 p_postintc_6 p_postintc~5 p_postintc~8 p_postintc~1 
p_constime_0 p_constime_6 p_constim~15 p_constim~18 p_constim~21 
p_starttim~0 p_starttim~6 p_startti~15 p_startti~18 p_startti~21 

现在主要的困难似乎是要为reshape long存根。这个代码足够玩具数据集。没有必要使用相同的信息扫描更多的变量名称。如果你没有所有时间点的所有变量,你可能需要更复杂的代码。

unab stubs: p_*_0 
local stubs : subinstr local stubs "0" "", all 
di "`stubs'" 

p_score_ p_postint_ p_postintc_ p_constime_ p_starttime_ 

这里我就不明白了全局的热情,但是,节目味道之余,你可以把最后的结果在全球很容易。

+0

谢谢尼克。对于难以表达的内容表示歉意,并感谢您生成示例数据。是的,我确实需要用于“重塑”的存根,以及稍后运行汇总统计信息的其他步骤(因此更倾向于全局性)。数据集中还有其他一些变量可以通过p _ * _ 0得到,我不想在这个存根列表中找到它。这个例子的'uniq'扩展函数是否会以任何方式工作(抛开我的冗余编码)?只是试图理解这个功能,并不能使用Stata手册或以前的问题搞清楚。 – jrc

+0

所以,你需要修改你喂食的东西,然后再进行一些手术以消除你不想要的东西。我不能提供代码,因为你的信号只是你真正的问题比你说的更复杂。对不起,我无法理解你想用'uniq'做什么。目前我缺乏提出两种解决方案的热情。 –

+0

否则,这是僵局。理解我的代码并不是完全按照你想要的去做的,但除非你直到你解释了什么是缺少的东西,否则在疯狂地猜测如何修改这个解决方案或者推荐另一个似乎没有意义的东西,相同的示例变量名称。 –