将值存储在宏变量中

时间:2012-10-19 18:12:48

标签: stata stata-macros

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

我想到的是以下几点:

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

这有用吗?还有另一个更有效的选择吗?我可以在R中轻松完成这个(因为向量比宏更容易使用),但是这个项目需要Stata。


澄清:

如果我有一个包含三个唯一值的变量abc,我想将它们存储在宏变量中,这样我以后可以使用另一个数据集并选择观察值匹配其中一个值。

通常可以使用inlist函数手动执行此操作,但我想对其进行软编码,以便我可以使用不同的值集运行程序。我无法使用inlist函数来处理宏。

3 个答案:

答案 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) |
     +------------------------------------------------------------------------------------------+

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