【问题标题】:Using Stata Variable Labels in R在 R 中使用 Stata 变量标签
【发布时间】:2011-01-10 04:54:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • 现在不在电脑上,但是我瘦hmisc有从spss导入标签的功能。也可以与 stata 一起使用?
  • 我知道这已经很老了,但是如果我的避风港解决方案有效,请看下面。

标签: r variables stata labels


【解决方案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 被丢弃,从而导致向量长度不同。

【讨论】:

    【解决方案2】:

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

    正如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")
    

    【讨论】:

    • 避风港套餐很棒。这也让我想起了 Stata 中的数据标签有多么有用,而我已经多年没有使用过了。我想知道是否有 R 包可以促进数据标签的创建。我知道我可以用 attr 来完成,但我宁愿用一个好的、用户友好的语法来完成它。
    • 是的,tibbles 包有一个标记的 tibble 类型!确认!
    • 这是正确答案。这个功能令人难以置信。
    【解决方案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 数据文件的功能。

    【讨论】:

    • 感谢埃里克的帮助。我对 Stata 的了解几乎不如 R(因为根本不知道)所以我已经采用了上面的解决方案。
    【解决方案4】:

    这是一个使用 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 了解更多信息。

    【讨论】:

    • 有趣的功能。我想我会为“谎言,该死的谎言”部分投票。
    【解决方案5】:

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

    【讨论】:

    • 谢谢,我刚刚在stat.ethz.ch/R-manual/R-patched/library/foreign/html/… 偶然发现了它,但我使用了 >attributes(a)$var.labels 然后我可以使用你的 data.key 想法并构建一个函数像这样重命名变量。再次感谢。
    • 当然,但是变量标签可能非常冗长,并且包含不建议用于变量名称的字符。
    • R中没有办法存储变量标签还是真的吗?
    • 对于像我这样由于版本限制而无法使用外国包的人,请查看下面使用have包的Bastiaan Quast的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多