2

我有很多变量,例如:

slsoke slsoke_g jfue jfue_g iii iii_g bsueo bsueo_g ...

还有其他变量没有这对,例如hid,pid,...

我必须删除不以_g结尾的变量,并将“_g”变量重命名为不带_g的变量。因此,例如,“slsoke”的值应该是过时的,“slsoke”应该是“slsoke_g”的精确副本。我如何编写代码来进行 Stata 中的更改?

4

2 回答 2

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

智能正则表达式可能有一个更短的解决方案。

于 2013-03-12T09:46:05.523 回答
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 
} 

无论你想要什么,如前所述,获取前缀似乎是最困难的一点,剩下的就是对前缀的循环。

于 2013-03-12T12:34:58.457 回答