假设var1
是连续的:
clear
set obs 1000
gen var1 = runiform()
sum var1
现在我想根据var1
的范围创建var2
。我可以这样做:
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"))
使用cut
在R
中做一些非常类似的事情的方法是在R中基于范围创建分类变量
是否有任何命令可以在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", ""))))
有更好的方法吗?
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 |
+----------------------------------------+
然而,如果你真的有10,000个范围要指定,并且它们不能归结为一些简单的规则,那么你自然不会使用这两种方法。您应该将它们放在一个文件中,并使用一些基于merge
的代码。
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 |
+------------------------------+