2015-09-24 2 views
0

сказать, что я var1, непрерывное:Как Просто Создать новую переменную на основе размахов другого

clear 
set obs 1000 
gen var1 = runiform() 
sum var1 

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

gen var2 = "Lowest" if var1<.25 
replace var2 = "Low" if var1>=.25 & var1<.5 
replace var2 = "High" if var1>=.5 & var1<.75 
replace var2 = "Highest" if var1>=.75 

Я хотел был бы иметь возможность сделать это в одной строке. Псевдокод:

gen var2 = (ranges(0 .25 .5 .75 1) values("Lowest" "Low" "High" "Highest")) 

способ сделать нечто похожее в R с использованием cut находится на Create categorical variable in R based on range

Есть ли команда, которая может сделать что-то в Stata, которое, как R-версии? Представьте, что у вас есть 10 000 диапазонов, которые нужно переместиться в var2. Тогда лучший способ поможет.

Другим способом сделать это в одной строке в Stata неуклюжий и находится на http://www.stata.com/support/faqs/data-management/multiple-operations/:

generate var2 = cond(var1<=.25, "Lowest", cond(var1<=.50, "Low", cond(var1<=.75, "High", cond(var1<=1.00, "Highest", "")))) 

Есть ли лучший способ?

ответ

3

cond() функция является функцией якобы неуклюжим упоминается. См. Пример var3. У этого есть преимущества сигнала, что вы можете сделать неравенства явными в своем коде и точно так, как вы пожелаете, ни то, ни другое не относится к egen, cut().

В этом конкретном примере возможен, по крайней мере, еще один трюк. См. var4 ниже, для чего это.

. clear 

. set obs 15 
number of observations (_N) was 0, now 15 

. set seed 2803 

. gen var1 = runiform() 

. sort var1 

. gen var2 = "Lowest" if var1<.25 
(9 missing values generated) 

. replace var2 = "Low" if var1>=.25 & var1<.5 
(4 real changes made) 

. replace var2 = "High" if var1>=.5 & var1<.75 
(2 real changes made) 

. replace var2 = "Highest" if var1>=.75 
variable var2 was str6 now str7 
(3 real changes made) 

. gen var3 = cond(var1 < .25, "Lowest", cond(var1 <.5, "Low", cond(var1 <.75, " 
> High", "Highest"))) 

. gen var4 = word("Lowest Low High Highest", ceil(4 * var1)) 

. list 

    +----------------------------------------+ 
    |  var1  var2  var3  var4 | 
    |----------------------------------------| 
    1. | .0200225 Lowest Lowest Lowest | 
    2. | .0360774 Lowest Lowest Lowest | 
    3. | .0934085 Lowest Lowest Lowest | 
    4. | .0950848 Lowest Lowest Lowest | 
    5. | .1040797 Lowest Lowest Lowest | 
    |----------------------------------------| 
    6. | .1795591 Lowest Lowest Lowest | 
    7. | .3326341  Low  Low  Low | 
    8. | .3383934  Low  Low  Low | 
    9. | .3870576  Low  Low  Low | 
10. | .3980427  Low  Low  Low | 
    |----------------------------------------| 
11. | .6264514  High  High  High | 
12. | .6305373  High  High  High | 
13. | .7739685 Highest Highest Highest | 
14. | .7935746 Highest Highest Highest | 
15. | .9243789 Highest Highest Highest | 
    +----------------------------------------+ 

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

2

Stata имеет функцию cut, как часть команды egen. Использование его опций и определение и присвоение метки значений дают вам желаемый результат (хотя и в трех строках, а не в одном, но это три довольно сжатые строки). .,

clear 
set obs 15 
gen var1 = runiform() 
sum var1 

gen var2 = "Lowest" if var1<.25 
replace var2 = "Low" if var1>=.25 & var1<.5 
replace var2 = "High" if var1>=.5 & var1<.75 
replace var2 = "Highest" if var1>=.75 

// ======================================================= 
// Using egen , cut() 
// ======================================================= 
label define rank 0 "Lowest" 1 "Low" 2 "High" 3 "Highest" 
egen var3 = cut(var1) , at(0(.25)1) icodes 
label values var3 rank 

li 

с результатом

 +------------------------------+ 
    |  var1  var2  var3 | 
    |------------------------------| 
    1. | .6658295  High  High | 
    2. | .3690664  Low  Low | 
    3. | .5983131  High  High | 
    4. | .2658775  Low  Low | 
    5. | .1211114 Lowest Lowest | 
    |------------------------------| 
    6. | .2296222 Lowest Lowest | 
    7. | .7229139  High  High | 
    8. | .2501513  Low  Low | 
    9. | .7775574 Highest Highest | 
10. | .2839603  Low  Low | 
    |------------------------------| 
11. | .8396428 Highest Highest | 
12. | .4838379  Low  Low | 
13. | .2610629  Low  Low | 
14. | .3855471  Low  Low | 
15. | .3447088  Low  Low | 
    +------------------------------+ 
Смежные вопросы