2015-07-11 2 views
0

У меня есть переменная sting, назовите ее desc, которая принимает множество разных значений, скажем 300. Я хочу создать две новые переменные, desc_a и desc_b. desc содержит два класса значений; Я хочу поместить тех, кто принадлежит к первому классу, в desc_a, а остальное - в desc_b. Я опишу один из способов, которым я придумал. Однако этот метод очень медленный. Мне интересно, есть ли лучший способ сделать это.Эффективный способ категоризации

gen desc_a = "" 
gen desc_b = "" 
tab desc 

Результирующий выходной вкладка может отображаться как (опуская ненужную информацию):

DESC     | Freq. Perc. Cum. 
___________________________________________ 
First Element of a  53 
Second Element of a  22 
First Element of b  78 
Third Element of a  232 
Second Element of b  33 

* вручную пройти и скопировать и вставить каждую строку вкладки в операторы, такие как:

replace desc_a = "First Element of a" if desc=="First Element of a" 
replace desc_a = "Second Element of a" if desc=="Second Element of a" 
replace desc_a = "Third Element of a" if desc=="Third Element of a" 
... 
replace desc_b = "First Element of b" if desc=="First Element of b" 
replace desc_b = "Second Element of b" if desc=="Second Element of b" 

Обратите внимание, что фактические данные фактически не соответствуют хорошему шаблону, подобному этому, и поэтому я не могу автоматизировать его с помощью регулярных выражений или чего-то подобного. Мне нужно вручную осмотреть каждый из них и решить, в какую категорию он войдет. Однако я считаю, что описанный мной метод, который включает в себя тонны копирования и вставки, - не лучший способ.

ответ

1

Это окно Stata Редактора данных поможет уменьшить ваши усилия.

Создайте набор данных Stata, содержащий две переменные: 300 различных значений desc и переменную, я назову ее ab, инициализированной отсутствующей. Затем откройте набор данных в редакторе данных Stata и опустите наблюдения, заменив (набрав в ячейках) недостающие значения индикатором того, принадлежит ли описание в группе a или b (скажем, 1 или 2). Затем сохраните этот набор данных и объедините его с исходным набором данных и используйте объединенное значение ab, чтобы назначить описание соответствующей переменной.

generate desc_a = desc if ab==1 
generate desc_b = desc if ab==2 
0

Это не самое лучшее, но это улучшение по сравнению с моими выше решениями:

gen desc_a = "" 
replace 
replace desc_a = desc if desc=="First Element of a" 
replace desc_a = desc if desc=="Second Element of a" 
replace desc_a = desc if desc=="Third Element of a" 
... 

replace desc_b = desc if desc_a=="" 
1

Чтобы расширить @ решения Уильяма

* recreate your data example 
clear 
input str19 desc int n 
"First Element of a" 53 
"Second Element of a" 22 
"First Element of b " 78 
"Third Element of a" 232 
"Second Element of b" 33 
end 
expand n 
set seed 314324 
gen somedata = runiform() 
sort somedata 
tab des 
tempfile main 
save "`main'" 

* reduce to one observation per value of desc 
bysort desc: keep if _n == 1 
keep desc 

* make an effort to identify a or b, note that 
* the following fails for one obs 
gen ab = regexs(1) if regexm(desc,"(a|b)$") 

* save and edit manually 
tempfile toedit 
save "`toedit'" 

* this is simulated editing... 
clear 
input str19 desc str1 ab 
"First Element of a" "a" 
"First Element of b " "b" 
"Second Element of a" "a" 
"Second Element of b" "b" 
"Third Element of a" "a" 
end 

* now combine with the original data 
merge 1:m desc using "`main'", assert(match) nogen 
Смежные вопросы