2015-03-03 3 views
2

Я очистки переменной строки в Stata, которая имеет числовые значения, но иногда имеет значения, отформатированные в виде диапазона, так как в 1-50 или 1-3 и т.д.Stata Строка Диапазон очистки

Когда я пытаюсь destring эти переменные, эти досадные диапазоны мешают мне сделать это.

Что я хотел бы сделать, это заменить диапазон на среднее значение первого числа и последнего номера в диапазоне. Я попытался следующие строковые функции, чтобы сделать это:

replace `var' = ((regexs(1) + regexs(3))/2) if regexm(`var', "([0-9]*)([\-])([0-9]*)") 

Однако Stata не понимает средний ((regexs(1) + regexs(3))/2), потому что он читает regexs(1) и regexs(2) как подстроки.

Я знаю, что могу сделать это, создав новые переменные, но данные, с которыми я работаю, имеют тысячи переменных, поэтому я бы предпочел просто заменить существующую строку.

Любые идеи о том, как это сделать?

Заранее спасибо

+0

Обратите внимание, что иногда для диапазонов лучше понимать геометрическое среднее, если оба значения являются положительными. (Тысячи _переменных_ или тысяч _values_?) –

+0

Отмечено, спасибо! Иногда цифры могут быть отрицательными, и у меня около 1500 переменных, а не значений –

ответ

2

Вот один из способов, который разбивает строки в 2, где это применимо и destrings их:

#delimit; 
clear; 

set obs 4; 

input str4 x str4 y; 
"13" "4-7"; 
"1-50" "7"; 
"1-3" "9-20"; 
""  "4"; 

foreach var of varlist x y {; 
    split `var', parse("-") destring; 
    egen clean_`var' = rowmean(`var'1 `var'2); 
    drop `var'1 `var'2; 
}; 
2

Вы можете использовать real() для преобразования строки в числовой.

clear 
set more off 

input /// 
str6 range 
"1-50" 
"1-3" 
end 

list 

gen range2 = (real(regexs(1)) + real(regexs(3)))/2 if /// 
    regexm(range, "([0-9]*)([\-])([0-9]*)") 

list 

Однако, если регулярные выражения не были строго необходимы (что-то я не могу быть уверен) я бы с split как Димитрий уже указывался. Заметьте, что я создал новую переменную. Избавление от оригинала, в общем, не хорошая практика.

+0

Это умно! –

+0

Спасибо. Я на самом деле никогда не использовал его так, но это имеет смысл. –

+0

Большое спасибо! это отлично –

1

Другой способ сделать это будет (начиная со строки переменной mystring)

gen myst = subinstr(mystring, "-", " ", .) 
assert inlist(wordcount(myst), 1, 2) 
gen mynumeric = cond(word(myst, 2) == "", real(word(myst, 1)), (real(word(myst,1)) + real(word(myst, 2))/2) 

Этот вид метода является пешеход тем, свободно в синтаксисе регулярных выражений, но может быть проще продумать для других.

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