如何检查宏的元素是否在另一个宏中
How to check if elements of macro are in another macro
我有一个看似简单的问题,但实际上它似乎更复杂。例如,在 python 中,它似乎要简单得多。但我真的很想学习如何在 Stata 中执行此操作。
说我有一个大数据集。我有几个字符串变量,S1
、S2
和 S3
。根据某些标准,我得到了 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
我感兴趣的是获取 S1
、S2
和 S3
中所有不同值的列表。我考虑过这样做的一种方法是:
- 将
S1
的所有所需值保存到宏 M1
中。我没有弄清楚如何做到这一点。
- 将
S2
的所有所需值保存到宏中,M2
。
- 检查
M2
的值是否在 M1
中。不要将 M2
的值添加到 M1
中已经存在于 M1
中的值,而是将 M2
的值添加到 M1
中尚不存在的值。看起来 this post 与如何执行此步骤类似。 (为什么list
前面有个:
?)
- 重复步骤 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 macrolists
和 help 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'"'
详细说明变量的组织方式(例如一个或多个文件)、是否关心破坏原始数据集、缺失值的处理等,可能会给您一个特别的答案。
我有一个看似简单的问题,但实际上它似乎更复杂。例如,在 python 中,它似乎要简单得多。但我真的很想学习如何在 Stata 中执行此操作。
说我有一个大数据集。我有几个字符串变量,S1
、S2
和 S3
。根据某些标准,我得到了 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
我感兴趣的是获取 S1
、S2
和 S3
中所有不同值的列表。我考虑过这样做的一种方法是:
- 将
S1
的所有所需值保存到宏M1
中。我没有弄清楚如何做到这一点。 - 将
S2
的所有所需值保存到宏中,M2
。 - 检查
M2
的值是否在M1
中。不要将M2
的值添加到M1
中已经存在于M1
中的值,而是将M2
的值添加到M1
中尚不存在的值。看起来 this post 与如何执行此步骤类似。 (为什么list
前面有个:
?) - 重复步骤 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 macrolists
和 help 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'"'
详细说明变量的组织方式(例如一个或多个文件)、是否关心破坏原始数据集、缺失值的处理等,可能会给您一个特别的答案。