我使用levelsof
命令来识别变量的唯一值并将它们粘贴到宏中。然后,我想在宏中使用这些值来从我将要加载的另一个数据集中选择记录。
我想到的是以下几点:
keep if inlist(variable, "`macrovariable'")
这有用吗?还有另一个更有效的选择吗?我可以在R中轻松完成这个(因为向量比宏更容易使用),但是这个项目需要Stata。
澄清:
如果我有一个包含三个唯一值的变量a
,b
和c
,我想将它们存储在宏变量中,这样我以后可以使用另一个数据集并选择观察值匹配其中一个值。
通常可以使用inlist
函数手动执行此操作,但我想对其进行软编码,以便我可以使用不同的值集运行程序。我无法使用inlist
函数来处理宏。
答案 0 :(得分:3)
* the source data
levelsof x, local( allx )
* make it -inlist-friendly
local allxcommas : subinstr local allx " " ", ", all
* bring in the new data
use using blah.dta if inlist(x, `allxcommas')
答案 1 :(得分:0)
我怀疑您使用levelsof
生成的inlist
生成的宏的困难在于您忘记使用separate(,)
选项。我也不相信您可以将inlist
函数与keep if
一起使用 - 您需要添加定义新指标的额外步骤。
在下面的示例中,我使用了1978年的自动数据并创建了一个车辆制造商(或制造商)的变量make_abb
,它只采用了少数不同的值(道奇的“Do”等)。
然后我使用levelsof
命令生成制造商的本地宏,这些制造商的车辆型号维修记录很差(变量rep78
是一个分类维修记录变量,其中1表示差, 5很好)。选项separate(,)
是将逗号添加到宏中并使inlist在以后读取它的原因。
最后,如果我想删除 not 的修复记录很差的制造商,我会生成一个名为“keep_me”的虚拟变量,并使用inlist函数填充它。
*load some data
sysuse auto
*create some make categories by splitting the make and model string
gen make_abb=substr(make,1,2)
lab var make_abb "make abbreviation (string)"
*use levelsof with "local(macro_name)" and "separate(,)" options
levelsof make_abb if rep78<=2, separate(,) local(make_poor)
*generate a dummy using inlist and your levelsof macro from above
gen keep_me=1 if inlist(make_abb,`make_poor')
lab var keep_me "dummy of makes that had a bad repair record"
*now you can discard the rest of your data
keep if keep_me==1
答案 2 :(得分:-1)
这似乎对我有用。
* "using" data
clear
tempfile so
set obs 10
foreach v in list a b c d {
generate `v' = runiform()
}
save `so'
* "master" data
clear
set obs 10
foreach v in list e f g h {
generate `v' = runiform()
}
* merge
local tokeepusing a b
merge 1:1 _n using `so', keepusing(`tokeepusing')
收率:
. list
+------------------------------------------------------------------------------------------+
| list e f g h a b _merge |
|------------------------------------------------------------------------------------------|
1. | .7767971 .5910658 .6107377 .7256517 .357592 .8953723 .0871481 matched (3) |
2. | .643114 .6305301 .6441092 .7770287 .5247816 .4854506 .3840067 matched (3) |
3. | .3833295 .175099 .4530386 .5267127 .628081 .2273252 .0460549 matched (3) |
4. | .0057233 .1090542 .1437526 .3133509 .604553 .9375801 .8091199 matched (3) |
5. | .8772233 .6420991 .5403687 .1591801 .5742173 .8948932 .4121684 matched (3) |
|------------------------------------------------------------------------------------------|
6. | .6526399 .5137199 .933116 .5415702 .4313532 .8602547 .5049801 matched (3) |
7. | .2033027 .8745837 .8609 .0087578 .9844069 .1909852 .3695011 matched (3) |
8. | .6363281 .0064866 .6632325 .307236 .9544498 .6267227 .2908498 matched (3) |
9. | .366027 .4896181 .0955155 .4972361 .9161932 .7391482 .414847 matched (3) |
10. | .8637221 .8478178 .5457179 .8971257 .9640535 .541567 .1966634 matched (3) |
+------------------------------------------------------------------------------------------+
这是否回答了你的问题?如果没有,请发表评论。