23

我有一堆我想在 R 中使用的 Stata .dta 文件。

我的问题是变量名称对我没有帮助,因为它们就像“q0100”、“q0565”、“q0500”和“q0202”。但是,它们被标记为“psu”、“怀孕人数”、“户主”和“航路点”。

我希望能够获取标签(“psu”、“waypoint”等......)并将它们用作我的变量/列名,因为这些对我来说更容易使用。

有没有办法做到这一点,最好是在 R 中,或者通过 Stata 本身?我知道 library(foreign) 中的 read.dta,但不知道它是否可以将标签转换为变量名。

4

5 回答 5

27

R 没有内置的方法来处理变量标签。我个人认为这是应该解决的缺点。Hmisc 确实为处理变量标签提供了一些便利,但标签只能被该包中的函数识别。read.dta 创建一个带有“var.labels”属性的data.frame,其中包含标签信息。然后,您可以从中创建数据字典。

> data(swiss)
> write.dta(swiss,swissfile <- tempfile())
> a <- read.dta(swissfile)
> 
> var.labels <- attr(a,"var.labels")
> 
> data.key <- data.frame(var.name=names(a),var.labels)
> data.key
          var.name       var.labels
1        Fertility        Fertility
2      Agriculture      Agriculture
3      Examination      Examination
4        Education        Education
5         Catholic         Catholic
6 Infant_Mortality Infant.Mortality

当然这个 .dta 文件没有很有趣的标签,但你的应该更有意义。

于 2010-01-28T03:22:58.057 回答
13

我建议您使用新的Haven 包( GitHub ) 来导入您的数据。

正如Hadley WickhamREADME.md 文件中提到的:

您总是会得到一个数据框,日期时间被转换为相应的 R 类,并且标记的向量作为新的标记类返回。您可以根据需要轻松地强制转换因子或用缺失值替换标记值。如果您还使用 dplyr,您会注意到以方便的方式打印大数据帧。

(强调我的)

如果您使用RStudioView("data.frame") ,这将自动在查看器窗格 ( source )中的变量名称下显示标签。

变量标签作为属性附加到每个变量。这些没有打印出来(因为它们往往很长),但如果你有 RStudio 的预览版,你会在改进的查看器窗格中看到它们。

您可以使用以下方法安装软件包:

install.packages("haven")

并使用以下命令导入您的 Stata 日期:

read_dta("path/to/file")

有关更多信息,请参阅:

help("read_dta")
于 2015-11-12T13:12:08.213 回答
3

这是一个使用 Stata 变量标签评估您想要的任何表达式的函数:

#' Function to prettify the output of another function using a `var.labels` attribute
#' This is particularly useful in combination with read.dta et al.
#' @param dat A data.frame with attr `var.labels` giving descriptions of variables
#' @param expr An expression to evaluate with pretty var.labels
#' @return The result of the expression, with variable names replaced with their labels
#' @examples
#' testDF <- data.frame( a=seq(10),b=runif(10),c=rnorm(10) )
#' attr(testDF,"var.labels") <- c("Identifier","Important Data","Lies, Damn Lies, Statistics")
#' prettify( testDF, quote(str(dat)) )
prettify <- function( dat, expr ) {
  labels <- attr(dat,"var.labels")
  for(i in seq(ncol(dat))) colnames(dat)[i] <- labels[i]
  attr(dat,"var.labels") <- NULL
  eval( expr )
}

然后你可以prettify(testDF, quote(table(...)))或任何你想要的。

有关更多信息,请参阅此线程

于 2013-03-10T01:41:44.280 回答
3

在将变量标签导出到 R 或文本文件之前,您可以在 Stata 中将变量标签转换为变量名称。
正如 Ian 所提到的,变量标签通常不会产生好的变量名称,但如果您将空格和其他字符转换为下划线,并且如果您的变量标签不太长,您可以很容易地使用 varlabels 重新标记您的 var。

下面是一个使用内置 Stata 数据集“cancer.dta”将所有变量名称替换为 var 标签的示例——重要的是,此代码不会尝试重命名没有变量标签的变量。请注意,我还选择了一个数据集,其中有很多在命名变量时无用的字符(例如:=、1、'、.、() 等)......您可以添加任何可能潜伏的字符在第 5 行列表中的变量标签中:“local chars”...“”,它将为您进行更改:

****************! BEGIN EXAMPLE
//copy and paste this code into a Stata do-file and click "do"//
sysuse  cancer, clear
desc
**
local chars "" " "(" ")" "." "1" "=" `"'"' "___" "__" "
ds, not(varlab "")    // <-- This will only select those vars with varlabs //
foreach v in `r(varlist)' {
    local `v'l "`:var lab `v''"
    **variables names cannot have spaces or other symbols, so::
        foreach s in `chars' {
    local `v'l: subinstr local `v'l "`s'" "_", all
              }
    rename `v' ``v'l'
    **make the variable names all lower case**
    cap rename ``v'l' `=lower("``v'l'")'
      }
desc
****************! END EXAMPLE

您还可以考虑查看Stat Transfer及其将 Stata 转换为 R 数据文件的功能。

于 2010-07-14T02:08:37.057 回答
1

使用 Haven 包时:

如果您要导入的数据集很重,在 Rstudio 中查看数据可能不是最佳的。

您可以改为获取包含列名、列标签和列是否被标记的指示符的 data.frame:

d <- read_dta("your_stata_data.dta") 

vars <- data.frame(
                   "name" = names(d),
                   "label" = sapply(d, function(x) attr(x, "label"))  %>% as.character(),
                   "labelled" = sapply(d, is.labelled) )

注意:需要使用 as.characted 以避免标签中的 NULL 被丢弃,从而导致向量长度不同。

于 2019-01-21T00:05:57.807 回答