使用从 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 中所做的事情。
我对 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 中所做的事情。