我有一堆Stata .dta文件,我想在R中使用。
我的问题是变量名对我没有帮助,因为它们就像“q0100”,“q0565”,“q0500”和“q0202”。但是,它们被标记为“psu”,“怀孕人数”,“户主”和“航点”。
我希望能够抓住标签(“psu”,“航点”等等)并将它们用作我的变量/列名称,因为这些对我来说更容易使用。
有没有办法做到这一点,最好是在R中,还是通过Stata本身?我知道库(外国)中的read.dta,但不知道它是否可以将标签转换为变量名。
答案 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 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")
答案 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被丢弃,并因此以不同的向量长度结束。