如何检查宏的元素是否在另一个宏中

How to check if elements of macro are in another macro

我有一个看似简单的问题,但实际上它似乎更复杂。例如,在 python 中,它似乎要简单得多。但我真的很想学习如何在 Stata 中执行此操作。

说我有一个大数据集。我有几个字符串变量,S1S2S3。根据某些标准,我得到了 S1 的一个子集。假设这让我明白了(排序后只显示感兴趣的数据):

    S1
1   A
2   B
3   C
4   D
5   E

根据不同的标准,我得到 S2:

    S2
1   B
2   B
3   C
4   F

对于S3

    S3
1   B
2   Long string

我感兴趣的是获取 S1S2S3 中所有不同值的列表。我考虑过这样做的一种方法是:

  1. S1 的所有所需值保存到宏 M1 中。我没有弄清楚如何做到这一点。
  2. S2 的所有所需值保存到宏中,M2
  3. 检查 M2 的值是否在 M1 中。不要将 M2 的值添加到 M1 中已经存在于 M1 中的值,而是将 M2 的值添加到 M1 中尚不存在的值。看起来 this post 与如何执行此步骤类似。 (为什么list前面有个:?)
  4. 重复步骤 3,除了 S3/M3 而不是 S2/M2

这将生成具有以下值的宏 M1

A   B   C   D   E   F   Long String

请注意,我不需要在宏中使用它。如果它可以采用矩阵或其他方式,那也可以。重要的部分是获取信息。

有几种方法可以做到这一点。

这个例子中做出的许多假设(很多事情在你的post中并不清楚):

clear
set more off

input ///
str15(s1 s2 s3)
a "b" "b"
b "b" "long string"
c "c" ""
d "f" ""
e "" ""
end

list

stack s*, into(news) clear
bysort news : keep if _n == 1

drop _stack
list

如果您想使用宏来解决问题,那么 help macrolistshelp levelsof 可以提供帮助:

clear
set more off

input ///
str15(s1 s2 s3)
a "b" "b"
b "b" "long string"
c "c" ""
d "f" ""
e "" ""
end

list

local uvalues
foreach var of varlist _all {
    levelsof `var', local(loc`var')
    local uvalues : list uvalues | loc`var'
}

display `"`uvalues'"'

详细说明变量的组织方式(例如一个或多个文件)、是否关心破坏原始数据集、缺失值的处理等,可能会给您一个特别的答案。