我有很多变量,例如:
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
}
无论你想要什么,如前所述,获取前缀似乎是最困难的一点,剩下的就是对前缀的循环。