String 如何检查宏的元素是否在另一个宏中
我有一个看似简单的问题,但实际上它似乎更复杂。例如,在python中,它似乎要简单得多。但我真的很想学习如何在斯塔塔做到这一点 假设我有一个大数据集。我有几个字符串变量,String 如何检查宏的元素是否在另一个宏中,string,unique,stata,String,Unique,Stata,我有一个看似简单的问题,但实际上它似乎更复杂。例如,在python中,它似乎要简单得多。但我真的很想学习如何在斯塔塔做到这一点 假设我有一个大数据集。我有几个字符串变量,S1、S2和S3。我根据一些标准得到了S1的子集。假设这得到了我(排序后,只显示感兴趣的数据): 根据不同的标准,对于S2,我得到: S2 1 B 2 B 3 C 4 F 对于S3: S3 1 B 2 Long string 我感兴趣的是获取跨越S1、S2和S3的所有不同值的列表。我认
S1
、S2
和S3
。我根据一些标准得到了S1
的子集。假设这得到了我(排序后,只显示感兴趣的数据):
根据不同的标准,对于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
中还没有的值。这似乎类似于如何执行此步骤。(为什么在列表前面有一个:
?)
S3
/M3
而不是S2
/M2
M1
:
A B C D E F Long String
请注意,我不需要将其放在宏中。如果可以采用矩阵或其他方式,也可以。重要的部分是获取信息 有几种方法可以做到这一点 在这个例子中做了很多假设(在你的帖子中有很多事情不清楚): 如果您想使用宏来完成,则
帮助宏列表
和帮助级别
可以帮助:
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'"'
更多地说明变量的组织方式(例如,一个或多个文件)、是否有意破坏原始数据集、丢失的处理等,可能会让您得到一个特别的答案。您是否阅读了
帮助宏列表中的文档
?尽管您读了最后一段,你希望如何表达这一点确实会有所不同。如果你真正的问题像你的例子所暗示的那样小,那么宏操作就是你选择的工具,你可能比从levelsof
开始做得更糟。如果您有一个大问题,并且/或者您希望使用不同的值作为数据进行下游操作,则数据集操作集中在减少数据集,然后应用合并
可能是完全不同的方法。我不在乎是否破坏原始数据集。我能够修改您提供的代码,以获得所需的确切解决方案。谢谢
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
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'"'