我有一个看似简单的问题,但在实践中似乎更多涉及。例如,在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
前面有S3
?)M3
/ S2
代替M2
/ M1
除外。这将产生值A B C D E F Long String
,其值为:
{{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 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'"'
更多地谈论你的变量是如何组织的(例如一个或几个文件),无论你是否关心破坏原始数据集,对缺失的处理等都可能得到你的临时答案。