String 查找两个变量名标量的并集

String 查找两个变量名标量的并集,string,stata,local,stata-macros,String,Stata,Local,Stata Macros,我有一个Stata程序,它输出一个由空格分隔的变量名组成的局部标量 我必须在两个样本(相同的dta)上运行两次程序,并将并集(交集-变量名出现在两个标量中)存储为一个新的以空格分隔的局部标量(用于输入到另一个程序) 我不知道如何拆分(每个空格)和/或测试每个空格中变量名的出现情况。我不确定我是否完全理解您的问题,如果这不是合适的答案,请添加一个示例供我们使用 下面是检查两个空格分隔的宏并获得它们的交集的代码,即使它不是最优雅的,除非您的宏很大,否则它应该仍然非常快 local list1 fir

我有一个Stata程序,它输出一个由空格分隔的变量名组成的局部标量

我必须在两个样本(相同的
dta
)上运行两次程序,并将并集(交集-变量名出现在两个标量中)存储为一个新的以空格分隔的局部标量(用于输入到另一个程序)


我不知道如何拆分(每个空格)和/或测试每个空格中变量名的出现情况。

我不确定我是否完全理解您的问题,如果这不是合适的答案,请添加一个示例供我们使用

下面是检查两个空格分隔的宏并获得它们的交集的代码,即使它不是最优雅的,除非您的宏很大,否则它应该仍然非常快

local list1 first list here
local list2 list two here
local intersection 

foreach l1 in `list1' {
    foreach l2 in `list2' {
        // if they overlap, add to the intersection macro
        if "`l1'" == "`l2'" {
            local intersection `intersection' `l1'
        }
    }
}

mac list // show the macros stored currently in the do file

Stata有一系列扩展的宏函数可用于列表,您可以在帮助宏列表中找到这些宏函数,您可以看到a&B返回a和B的交集。如果a=“a B c d”和B=“B c f g”,则a&B=“B c”

这允许您执行以下操作:

clear
scalar l1="vara varb varc"
scalar l2="varc vard vare"
local l1 = scalar(l1)
local l2 = scalar(l2)
local inter: list l1 & l2
scalar inter="`inter'"
scalar list inter

将标量转换为局部变量,得到它们的并集,然后将其转换为标量。修改代码以使用局部变量而不是标量可能更容易,这样就不必处理转换。

局部变量和标量变量是不同的。标量可以有一个临时名称,这是不同的。无论哪种方式,显示代码并解释代码都是一个好主意。