Stata 宏列表 uniq 扩展函数(从宏变量列表中删除重复项)

Stata macro list uniq extended function (remove duplicates from a macro var list)

这个问题已经过编辑以添加示例数据并清理(希望)每个反馈的一些不必要的步骤。

我从宽格式的纵向数据开始。我需要对多个不同的数据块进行子集化、重塑和执行汇总步骤。我想创建宏变量,其中包含重塑和其他宽格式和长格式重复步骤所需的 varlist。重塑的变量遵循 (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)'

开始使用长格式变量列表创建宏的步骤:

/*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 但同样的解决方案对我不起作用。

有什么想法吗?感谢帮助。

如果没有可重现的示例 (b),很难理解您正在尝试做的事情 (a),因为您的大部分代码只是将相同的 varlist 复制到不同的地方,这会让人分心。

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

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_

我不明白这里对全局变量的热情,但是,抛开编程品味不谈,您可以很容易地将最后一个结果放入全局变量中。