使用从 Stata 到 R data.frame 的值,但显示标签而不是值

Use values from Stata to R data.frame but show labels instead of values

我对 R 很陌生,但更习惯 Stata

我设法使用 library(foreign) 将数据库从 Stata 读取到 R data.frame

data=read.dta("mydata.dta", 
     convert.dates = TRUE, 
     convert.factors = TRUE,
     missing.type = FALSE,
     convert.underscore = FALSE, 
     warn.missing.labels = TRUE)
然而,

Values(在 Stata 语言的意义上)没有被导入,只有 labels 被导入。

让我再解释一下。假设我想操纵一个名为 "edu" 的教育变量。在 Stata 语言中,我使用 numeric values 而不是 labels 来操作我的变量,数据编辑器会显示标签,只要我定义了我的标签。例如,假设我的变量 "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 中那样做,即:假设我的数据是从 Stata 导出的,在编辑带有标签的 data.frame 时操作数值?

提前致谢。

您可以从两个方向解决这个问题:1. 您可以在将数据导入 R 之前从 Stata 中删除值标签,或者 2. 您可以更改 data.frame 的数据导入设置来自 R 中。这两条路线中哪一条更容易在某种程度上取决于您拥有的 Stata 版本和数据格式。

选项 1:

如果您想在 Stata 中执行此操作,我建议您首先阅读并可能安装来自 SSC 的 "label utilities" 软件包:sac inst labutil。这个包包含许多其他非常有用的标签操作工具,labdtch 或 "label detach" 命令,这将使您的值标签与其在 Stata 数据中的实际值分离。显然,您需要在将数据导入 R 之前完成所有这些操作。

选项 2:

如果您的数据已使用 Stata 版本 13 保存,R 包 readstata13 将为您节省时间和精力。要阅读有关该软件包的信息:see its manual on CRAN

如果使用 readstata13 是一个选项,您将需要组合命令 get.label and/or get.label.name 并将它们用作 get.origin.codes 的输入这正是您正在寻找的。

最后,如果使用 readstata13 不是一个选项,您应该尝试在 R 的导入命令中指定 as.numeric(levels(f))[f]。有关原因和更多详细信息,请参阅此 Whosebug question

如果可能,我建议尝试通过 R 来完成此操作,因为它会提供更可重现的工作流程。但是,如果您最终通过 Stata 执行此操作,我会在您的 R 文件中包含一个简短的注释,解释您在导入数据之前在 Stata 中所做的事情。