2

我正在使用该levelsof命令来识别变量的唯一值并将它们粘贴到宏中。然后稍后我想使用宏中的这些值从我将加载的另一个数据集中选择记录。

我想到的是以下几点:

keep if inlist(variable, "`macrovariable'")

那样有用吗?还有其他更有效的选择吗?我可以在 R 中轻松做到这一点(因为向量比宏更容易使用),但这个项目需要 Stata。


澄清:

如果我有一个具有三个唯一值和的变量a,我想将它们存储在一个宏变量中,以便稍后获取另一个数据集并选择与其中一个值匹配的观察值。bc

通常可以使用该inlist函数手动执行此操作,但我想对其进行软编码,以便我可以使用不同的值集运行程序。而且我无法使该inlist功能与宏一起使用。

4

3 回答 3

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')
于 2012-10-21T00:33:56.440 回答
0

levelsof我怀疑您使用with生成的宏的困难inlist在于您忘记使用该separate(,)选项。我也不相信你可以使用这个inlist函数keep if——你需要添加额外的步骤来定义一个新的指标。

在下面的示例中,我使用了 1978 年的汽车数据并创建了一个make_abb汽车制造商(或制造商)变量,该变量仅采用少数不同的值(道奇的“Do”等)。

然后,我使用该levelsof命令生成制造商的本地宏,该宏的制造商具有维修记录不佳的车型(该变量rep78是分类维修记录变量,其中 1 为不良,5 为良好)。该选项separate(,)是将逗号添加到宏中并允许 inlist 稍后读取它。

最后,如果我想删除没有不良维修记录的制造商我会生成一个名为“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
于 2015-11-18T16:21:26.667 回答
-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) |
     +------------------------------------------------------------------------------------------+

这回答了你的问题了吗?如果没有,请发表评论。

于 2012-10-20T17:10:54.617 回答