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

ここで最も難しいのは、 で終わるすべての変数名のプレフィックスを取得することです_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 に答える
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 に答える