在R中使用Stata变量标签

时间:2010-01-27 23:30:08

标签: r variables stata labels

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

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

我希望能够抓住标签(“psu”,“航点”等等)并将它们用作我的变量/列名称,因为这些对我来说更容易使用。

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

5 个答案:

答案 0 :(得分:20)

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

> 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文件没有非常有趣的标签,但你的标签应该更有意义。

答案 1 :(得分:6)

我建议您使用新的haven packageGitHub)  用于导入数据。

Hadley Wickham中提及README.md file

  

您始终获得数据框,日期时间转换为相应的R类,标记的矢量将作为新的标记类返回。您可以根据需要轻松强制使用因子或替换带有缺失的标记值。如果你也使用dplyr,你会注意到以一种方便的方式打印大数据帧。

(强调我的)

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

  

变量标签作为属性附加到每个变量。这些不打印(因为它们往往很长),但如果您有RStudio的预览版本,您将在修改过的查看器窗格中看到它们。

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

install.packages("haven")

并使用以下内容导入您的Stata日期:

read_dta("path/to/file")

有关详细信息,请参阅:

help("read_dta")

答案 2 :(得分:3)

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

下面是使用内置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数据文件的功能。

答案 3 :(得分: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(...)))或任何你想要的东西。

有关详细信息,请参阅this thread

答案 4 :(得分:0)

使用避风港包裹时:

如果要导入的数据集比较繁重,则在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被丢弃,并因此以不同的向量长度结束。