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

时间:2015-03-27 15:19:47

标签: string unique stata

我有一个看似简单的问题,但在实践中似乎更多涉及。例如,在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前面有S3?)
  4. 重复步骤3,M3 / S2代替M2 / M1除外。
  5. 这将产生值A B C D E F Long String ,其值为:

    {{1}}

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

1 个答案:

答案 0 :(得分:2)

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

在这个例子中做了很多假设(很多事情在你的帖子中都不清楚):

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'"'

更多地谈论你的变量是如何组织的(例如一个或几个文件),无论你是否关心破坏原始数据集,对缺失的处理等都可能得到你的临时答案。