2012-10-19 79 views
2

我正在使用levelsof命令來標識變量的唯一值並將其粘貼到macro中。然後,我想在宏中使用這些值來從另一個將加載的數據集中選擇記錄。所以像將值存儲在Stata中的宏變量中

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

這是否工作?還有另一種更有效的選擇嗎?我可以在R中做到這一點更容易(因爲向量比宏更容易處理),但是這個項目需要Stata。如果我有一個具有3個唯一值「a」,「b」和「c」的變量,我想將這些變量存儲在一個宏變量中,以便我稍後可以採用另一個數據集並選擇匹配的觀察值這些價值。所以通常你可以使用inlist函數手動完成這個工作,但是我想對它進行軟編碼,以便我可以用不同的值集來運行程序。我不能讓inlist函數與宏一起工作。

+0

你能更具體嗎?你試過了嗎?如果是這樣,它工作嗎?如果不是,你遇到了什麼問題? – goric

+0

雖然常用,但「唯一」(嚴格意義上只出現一次)並不是最好的術語。我建議「獨特」。 –

回答

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

這是否回答你的問題?如果沒有,請評論。

+0

我不認爲這解決了OP詢問的問題。 – StasK

+0

我也不確定,@StasK。如果OP真的需要'levelsof'功能來對另一個數據集中的id進行觀察,爲什麼不在該變量上進行「合併」呢? –

+0

@StasK - 你說得對,我正在回答一個不同的問題。但爲什麼不「合併」呢? –

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') 
+0

是否有解決'allxcommas'列表太長並且拋出'表達式太長'錯誤的情況? – radek

+0

在第四行(我編輯的時候是爲了更強大)還是在最後一行的'inlist()'評估點進行「本地」評估時,是否太長?我擔心後者不能被有意義地克服,無法將'allxcommas'分割成可管理的塊,然後將結果附加在一起。 – StasK

+0

非常感謝您的更新。當名單變得越來越長,「瀏覽」正在抱怨時,大塊失敗了。使用'use use'的好主意 - 會給它一個提示。 – radek

0

我懷疑你在使用levelsofinlist產生宏困難是,你忘了使用separate(,)選項。我也不相信你可以使用inlist功能與keep if - 你需要添加額外的步驟來定義一個新的指標。

在下面的示例中,我使用了1978年的自動數據,並創建了一個車輛製造商(或製造商)的變量make_abb,該變量只取得少數幾個不同的值(道奇等的「做」)。

然後,我使用levelsof命令生成車輛模型修理記錄較差的製造商的本地宏(變量rep78是一個分類維修記錄變量,其中1爲差,5爲好)。選項separate(,)是將逗號添加到宏中並使其能夠在以後讀取它。

最後,如果我想刪除而不是的修理記錄不良,我生成一個名爲「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 
+0

「我也不相信你可以用'keep if'來使用'inlist()'函數:這絕對沒有內在問題。考慮'sysuse auto,clear',後面加'keep if inlist(rep78,1,2,3)'。有什麼困難? –