我有很多变量,如:
slsoke slsoke_g jfue jfue_g iii iii_g bsueo bsueo_g ...
还有其他变量没有该对,例如hid,pid,......
我必须删除不以_g结尾的变量,并将“_g”变量重命名为没有_g的变量。因此,例如,“slsoke”的值应该是过时的,“slsoke”应该是“slsoke_g”的精确副本。如何编写代码来对Stata进行更改?
答案 0 :(得分: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
智能正则表达式可能有一个更短的解决方案。
答案 1 :(得分: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
}
(LATER EDIT)也许你想要更像这样的东西。
foreach w of local which {
replace `w' = `w'_g
drop `w'_g
rename `w' `w'_g
}
无论你想要什么,如前所述,获取前缀似乎是最困难的一点,其余的是前缀上的循环。