我有很多的變量,比如:塔塔:重命名變量
slsoke slsoke_g jfue jfue_g iii iii_g bsueo bsueo_g ...
而且也有其他的變量沒有對,如HID,PID,...
我要刪除不以_g結尾的變量,並將「_g」變量重命名爲不含_g的變量。因此,例如,「slsoke」的值應該是過時的,「slsoke」應該是「slsoke_g」的確切副本。我如何編寫代碼來完成Stata的變更?
我有很多的變量,比如:塔塔:重命名變量
slsoke slsoke_g jfue jfue_g iii iii_g bsueo bsueo_g ...
而且也有其他的變量沒有對,如HID,PID,...
我要刪除不以_g結尾的變量,並將「_g」變量重命名爲不含_g的變量。因此,例如,「slsoke」的值應該是過時的,「slsoke」應該是「slsoke_g」的確切副本。我如何編寫代碼來完成Stata的變更?
你或許可以寫這樣的事:
// 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
有可能是與智能正則表達式更短的解決方案。
這裏最困難的事情是獲取以_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
}
無論你想要什麼,就像前面說的,得到了前綴似乎是最困難的一點,剩下的就是在前綴的循環。
令人驚歎。謝謝你,神父。最後,隱藏了pid變量。我會弄清楚如何通過建立你的解決方案來保持這兩個變量。 – 2013-03-13 04:10:29
'local' macname'''''''''的形式的陳述,如果它們很長,就會咬你。改用'local'''''''''代替。有關完整故事,請參閱http://www.stata-journal.com/sjpdf.html?articlenum=pr0045。 –
2013-03-13 11:08:49
丟失'hid','pid'等不應該適用於我的解決方案,該解決方案僅適用於成對變量,其中一個帶有後綴且一個沒有後綴。 – 2013-03-13 12:12:50