2013-03-12 3 views
1

Я много переменных, как:Stata: переименовывать переменные

slsoke slsoke_g jfue jfue_g iii iii_g bsueo bsueo_g ... 

А также есть и другие переменные, которые не имеют пары, такие как скрываем, PID, ...

Я должен отбросить переменные, которые не заканчиваются на _g, и переименовать переменные «_g» тем, у кого нет _g. Так, например, значения для «slsoke» должны быть устаревшими, а «slsoke» должен быть точной копией «slsoke_g». Как написать код для внесения изменений в Stata?

ответ

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 

Там может быть короче решением с умным регулярным выражением.

+0

Amazing. Благодарю вас, о. Наконец, спрятанные переменные pid отбрасываются. Я выясню, как сохранить эти две переменные, опираясь на ваше решение. –

+0

Выражения формы 'local' macname' = "' '' 'укусят вас, если они длинны. Вместо этого используйте 'local' macname' '' '' '. См. Http://www.stata-journal.com/sjpdf.html?articlenum=pr0045 для полной истории. –

+0

Потерять 'hid',' pid' и т. Д. Не следует применять с моим решением, которое работает только на пары переменных, одно с одним и без вашего суффикса. –

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 
} 

Все, что вы хотите, как сказано ранее, получение префиксы кажется наиболее трудными немного, а остальное представляет собой цикл по префиксам.

Смежные вопросы