2013-03-12 173 views
1

我有很多的變量,比如:塔塔:重命名變量

slsoke slsoke_g jfue jfue_g iii iii_g bsueo bsueo_g ... 

而且也有其他的變量沒有對,如HID,PID,...

我要刪除不以_g結尾的變量,並將「_g」變量重命名爲不含_g的變量。因此,例如,「slsoke」的值應該是過時的,「slsoke」應該是「slsoke_g」的確切副本。我如何編寫代碼來完成Stata的變更?

回答

2

你或許可以寫這樣的事:

// example 

clear 
set obs 50 
gen hid = _n 
gen pid = floor(_n/5) 
local y = "slsoke jfue iii bsueo" 
foreach x of local y { 
    gen `x' = runiform() 
    gen `x'_g = int(10 * `x') 
} 

// the code 

local k "" 

qui d, varl 
local l = r(varlist) 
foreach x of local l { 
    cap qui replace `x' = `x'_g 
    if !_rc local k = "`k' `x'" 
} 

di as err "`k'" 
keep `k' 

// bye 

有可能是與智能正則表達式更短的解決方案。

+0

令人驚歎。謝謝你,神父。最後,隱藏了pid變量。我會弄清楚如何通過建立你的解決方案來保持這兩個變量。 – 2013-03-13 04:10:29

+0

'local' macname''''' ''''的形式的陳述,如果它們很長,就會咬你。改用'local'''''''''代替。有關完整故事,請參閱http://www.stata-journal.com/sjpdf.html?articlenum=pr0045。 – 2013-03-13 11:08:49

+0

丟失'hid','pid'等不應該適用於我的解決方案,該解決方案僅適用於成對變量,其中一個帶有後綴且一個沒有後綴。 – 2013-03-13 12:12:50

2

這裏最困難的事情是獲取以_g結尾的所有變量名的前綴。這可以這樣做:

unab which : *_g 
local which : subinstr local which "_g " " ", all 

細節是至關重要的。您正在尋找名稱末尾的_g,因此需要額外的空間,但您也需要更換空間。現在你可以循環使用該組前綴:

foreach w of local which { 
    drop `w'_g 
    rename `w' `w'_g 
} 

(後編輯)也許你想要更像這樣的東西。

foreach w of local which { 
    replace `w' = `w'_g 
    drop `w'_g 
    rename `w' `w'_g 
} 

無論你想要什麼,就像前面說的,得到了​​前綴似乎是最困難的一點,剩下的就是在前綴的循環。