【问题标题】:Use values from Stata to R data.frame but show labels instead of values使用从 Stata 到 R data.frame 的值,但显示标签而不是值
【发布时间】:2016-07-28 14:38:20
【问题描述】:

我对@9​​87654321@ 很陌生,对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)

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

让我再解释一下。假设我想操作一个名为“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

但是在我导入的Rdata.frame 中,标签被作为因子导入。每个因素都关联一个级别,该级别不一定对应于我的 Stata 值,因为它从 1 重新开始。同时,我不能使用级别来操纵我的变量。如果我想从我的数据集中删除标签低于高中学历的人,我必须写下整个标签:

data <- data[data$edu!="Less than high-school degree",]

这一点都不方便,尤其是标签又长又复杂的时候。

如果我的数据是从 Stata 导出的,是否可以像在 Stata 中一样,即:在编辑带有标签的 data.frame 时操作数值?

提前谢谢你。

【问题讨论】:

  • 是的,R 因子的整数代码总是从 1 开始计数。但是,一旦您知道新代码,您应该能够像f = factor(c("a","b")); f[ labels(f)[f] != 1 ] 一样使用它们(不包括“a”,它的代码为 1)。就个人而言,我将长标签映射到缩写词并使用这些缩写词(“none”、“hs”、“ug”、“g”)
  • 我从您的回答中得知 1)无法重复使用 Stata 整数代码(至少在直接将数据导入 R 时不会);但是 2) 可以使用 R 新级别;但是 3) 将长标签转换为短标签的方法仍然不那么繁琐。感谢您的帮助。
  • 是的。哦,还有一件事,R 的一个好处:您可以使用有序因子并使用不等式,取最大值和最小值等:f = factor(c("hs", "hs", "none", "g"), levels=c("none","hs","ug","g"), ordered=TRUE); f[ f &gt;= "ug" ]

标签: r import stata r-factor


【解决方案1】:

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

选项 1:

如果您想在 Stata 中执行此操作,我建议您首先阅读并可能安装来自 SSC 的“标签实用程序”包:sac inst labutil。除了许多其他非常有用的标签操作工具外,该软件包还包含labdtch 或“标签分离”命令,它将您的值标签与它们在 Stata 数据中的实际值分离。显然,您将在将数据导入 R 之前完成所有这些操作。

选项 2:

如果您的数据是使用 Stata 13 版本保存的,R 包readstata13 将为您节省时间和精力。要了解该软件包:see its manual on CRAN

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

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

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

【讨论】:

  • 我一直想知道从Stata12切换到Stata13的意义何在。现在我有了答案!
猜你喜欢
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多