【问题标题】:Stata macro list uniq extended function (remove duplicates from a macro var list)Stata 宏列表 uniq 扩展函数(从宏 var 列表中删除重复项)
【发布时间】:2017-06-12 14:06:48
【问题描述】:

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

我从宽格式的纵向数据开始。我需要对多个不同的数据块进行子集化、重塑和执行汇总步骤。我想用 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。到目前为止,这是我的代码。我的完整变量列表实际上要长得多。

使用宽格式 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 类似,但同样的解决方案对我不起作用。

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

【问题讨论】:

    标签: list unique stata stata-macros


    【解决方案1】:

    如果没有可重现的示例 (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_
    

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

    【讨论】:

    • 谢谢你,尼克。我为困难的演示而道歉,并感谢您生成示例数据。是的,我确实想要reshape long 的存根以及稍后运行汇总统计信息的其他步骤(因此更喜欢全局变量)。数据集中还有其他变量将被 p_*_0 拾取,我不希望在此存根列表中。 uniq 扩展函数是否能以任何方式适用于本示例(我的冗余编码除外)?只是想了解这个功能,使用 Stata 手册或以前的问题无法弄清楚。
    • 因此,您需要修改您提供给unab 的内容和/或之后进行一些手术以去除您不想要的内容。我不能建议代码,因为您的信号只是您的真正问题比您说的要复杂。抱歉,我不明白你想用uniq 做什么。目前我缺乏提出两种解决方案的热情。
    • 否则就僵持到这里了。了解我的代码并不能完全按照您的意愿执行,但是除非并且直到您解释缺少的内容,否则似乎没有必要疯狂猜测如何修改此解决方案或建议另一个解决方案,这将对相同的示例变量名称。
    • 我编辑了我原来的问题,希望变得更好。您的初步答案适用于一些修改。我的问题已解决,但我仍然对使用 uniq 函数感到好奇,因为它可能在其他地方有用,所以也许其他人会对此作出回应。感谢您的宝贵时间。
    • 您的问题记录在help macrolists。如果您将全局宏提供给list uniq,则必须说明它是带有该关键字的全局宏。因此你需要: list uniq global stubs。通过uniq 的方法对我来说仍然很迂回。您故意创建了一个太大的列表,然后不得不再次对其进行精简。顺便说一句,我经常创建宽而长的数据文件版本,但从未觉得需要使用全局变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多