我是R
的新手,更习惯于Stata
。
我设法使用Stata
从R
读取数据库data.frame
library(foreign)
。
data=read.dta("mydata.dta",
convert.dates = TRUE,
convert.factors = TRUE,
missing.type = FALSE,
convert.underscore = FALSE,
warn.missing.labels = TRUE)
值(在Stata语言中)不会导入,只会导入标签。
让我再解释一下。假设我想操纵一个名为“edu”的教育变量。在Stata语言中,我使用数值而不是标签来操作我的变量,数据编辑器显示标签,只要我定义了我的标签。例如,假设我的变量“edu”取值10到40,以下代码将标签与每个值相关联:
label define lib_edu
10 "Less than high-school degree"
20 "12th grade or higher, no college degree"
30 "Undergraduate level (2 to 4 years of college)"
40 "Graduate level (5 years of college or more)", add;
label values edu lib_edu;
然后,当我想操纵我的变量时,我需要使用这些值。例如,如果我想从我的数据集中删除标签低于高中学历的人,我只是这样做:
drop if edu==10
但是在我导入的R
data.frame
中,标签被导入为因子。每个因素都与一个级别相关联,这个级别不一定与我的Stata值相对应,因为它从1重新开始。同时,我不能使用级别来操纵我的变量。如果我想从我的数据集中删除标签低于高中学历的人,我必须写下整个标签:
data <- data[data$edu!="Less than high-school degree",]
这根本不方便,特别是当标签很长而且复杂时。
是否可以像在Stata中那样进行操作,即:在编辑带有标签的data.frame时操作数值,假设我的数据是从Stata导出的?
提前感谢你。
答案 0 :(得分:1)
您可以从两个方向处理此问题:1。您可以在将数据导入R之前从Stata中删除值标签,或2.您可以从R中更改data.frame的数据导入设置。这两条路线中的哪一条更容易取决于您在哪种版本的Stata以及您的数据格式。
选项1:
如果您想在Stata中执行此操作,我建议您先阅读并尽可能安装SSC的“标签实用程序”包:sac inst labutil
。此包中包含用于操作标签的许多其他非常有用的工具,labdtch
或“label detach”命令,它将使您的值标签与Stata数据中的实际值分离。显然,在将数据导入R之前,您将完成所有这些操作。
选项2:
如果您的数据已使用Stata版本13保存,则R包readstata13
将为您节省时间和精力。要了解该软件包:see its manual on CRAN。
如果使用readstata13
是一个选项,则需要将get.label
和/或get.label.name
命令组合使用,并将其用作get.origin.codes
的输入你在寻找。
最后,如果不能使用readstata13
,则应尝试在R中的导入命令中指定as.numeric(levels(f))[f]
。有关原因和更多详细信息,请参阅此StackOverflow question。
如果可能的话,我建议尝试通过R来实现这一点,因为它将提供更可重复的工作流程。但如果您最终通过Stata执行此操作,我会在您的R文件中包含一条简短的注释,说明您在导入数据之前在Stata中所做的操作。