我是第一次使用 Stata。直到这周我才使用它,我正在尝试通过一些例子来工作。我有以下一组数据:
contruse | educ_none | educ_prim | educ_secabove
1 | 0 | 1 | 0
0 | 1 | 0 | 0
...
我用相应的数据集创建了以下变量,这样我就可以tab
contruse
所有不同的教育。
gen education=0
replace education=1 if educ_none==1
replace education=2 if educ_prim==1
replace education=3 if educ_secabove==1
replace education=. if educ_none==. | educ_prim==. | educ_secabove==.
tab education, missing
contruse | educ_none | educ_prim | educ_secabove | education
1 | 0 | 1 | 0 | 2
0 | 1 | 0 | 0 | 1
基本上有没有更好的方法来做到这一点:例如我的 varlist 可以任意大并且执行上述操作很痛苦。有没有一种方法可以说反转以下内容以处理多个变量并为单个变量赋值?
foreach x of varlist educ_none educ_prim educ_secabove {
replace `x' = . if var > 3
}
最佳答案
你能自动化这个过程吗? 答案是“否”,因为每个组件变量都会有一个唯一的后缀。因此,如果您有“race_black”、“race_hisp_nonw”、“race_white”,例如,您不能以相同的方式处理“education”和“race”变量。您还将为每个变量分配唯一的值标签。 请参阅下面的第二个答案。
另外两个问题:
看了你的例子,好像是为了教育 正好是三类。所以你正在初始化 一个不存在的类别。
您对缺失的处理可能不正确。 您已将教育设置为缺失,如果其任何组成部分 不见了。有可能面试官正确地将其中一个组成变量编码为“1”并离开了 其他值本应编码为“0”时为空白(缺失)。不应设置针对该观察的教育 想念。
这是我对代码的看法:
set linesize 100
clear
input id educ_none educ_prim educ_secabove
1 0 1 0
2 1 0 0
3 0 0 1
4 . 1 . /* Okay */
5 . . . /* Really Missing */
6 0 0 0 /* Really Missing */
7 . 1 1 /* Illegal */
end
egen etot = rowtotal(educ_*) /* = 1 for valid values */
foreach x of varlist educ_* {
/* Tentatively fix incorrect missings */
replace `x'= 0 if `x'==. & etot==1
}
list
gen education = 1 if educ_none==1
replace education=2 if educ_prim==1
replace education=3 if educ_secabove==1
/* Assign extended missing for illegal values*/
replace education = .a if etot >1 & etot<.
#delim ;
label define educl
1 "None"
2 "Primary"
3 "Secondary+"
.a ">1 indicator is 1"
;
#delim cr
label values education educl
list
tab education, missing
关于loops - 将一个变量的值替换为其他变量的值 Stata 13,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23964924/