Pergunta

Eu tenho vários arquivos Stata .dta que gostaria de usar em R.

Meu problema é que os nomes de variáveis ​​não são úteis para mim, pois são como "Q0100", "Q0565", "Q0500" e "Q0202". No entanto, eles são rotulados como "PSU", "Número de grávida", "Chefe de família" e "Waypoint".

Eu gostaria de poder pegar os rótulos ("psu", "waypoint" etc...) e usá-los como nomes de variáveis/colunas, pois será mais fácil trabalhar com eles.

Existe uma maneira de fazer isso, preferencialmente em R, ou através do próprio Stata?Conheço o read.dta na biblioteca (estrangeira), mas não sei se ele pode converter os rótulos em nomes de variáveis.

Foi útil?

Solução

R não possui uma maneira integrada de lidar com rótulos de variáveis.Pessoalmente penso que esta é uma desvantagem que deve ser corrigida.O Hmisc fornece alguma facilidade para lidar com rótulos de variáveis, mas os rótulos são reconhecidos apenas pelas funções desse pacote.read.dta cria um data.frame com um atributo "var.labels" que contém as informações de rotulagem.Você pode então criar um dicionário de dados a partir disso.

> 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

É claro que este arquivo .dta não possui rótulos muito interessantes, mas o seu deve ser mais significativo.

Outras dicas

Eu recomendaria que você usasse o novo pacote refúgio (GitHub) para importar seus dados.

Como Hadley Wickham menciona no Arquivo README.md:

Você sempre obtém um quadro de dados, as datas e horas são convertidas nas classes R correspondentes e vetores rotulados são retornados como uma nova classe rotulada.Você pode facilmente forçar fatores ou substituir valores rotulados por valores ausentes, conforme apropriado.Se você também usar o dplyr, notará que grandes quadros de dados são impressos de maneira conveniente.

(ênfase minha)

Se você usar RStudio isso exibirá automaticamente os rótulos sob os nomes das variáveis ​​no View("data.frame") painel do visualizador (fonte).

Os rótulos das variáveis ​​são anexados como um atributo a cada variável.Eles não são impressos (porque tendem a ser longos), mas se você tiver uma versão prévia do RStudio, você os verá no painel do visualizador renovado.

Você pode instalar o pacote usando:

install.packages("haven")

e importe sua data Stata usando:

read_dta("path/to/file")

Para mais informações consulte:

help("read_dta")

Aqui está uma função para avaliar qualquer expressão desejada com rótulos de variáveis ​​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 )
}

Você pode então prettify(testDF, quote(table(...))) ou o que você quiser.

Ver este tópico para mais informações.

Você pode converter os rótulos das variáveis ​​em nomes de variáveis ​​no Stata antes de exportá-los para um R ou arquivo de texto.
Como Ian menciona, rótulos de variáveis ​​geralmente não são bons nomes de variáveis, mas se você converter espaços e outros caracteres em sublinhados e se seus rótulos de variáveis ​​não forem muito longos, você poderá rotular novamente seus vars com varlabels com bastante facilidade.

Abaixo está um exemplo usando o conjunto de dados embutido do Stata "cancer.dta" para substituir todos os nomes de variáveis ​​​​por rótulos var - é importante ressaltar que este código não tentará renomear variáveis ​​​​sem rótulos de variáveis.Observe que também escolhi um conjunto de dados onde há muitos caracteres que não são úteis para nomear uma variável (por exemplo:=, 1, ', ., (), etc)... você pode adicionar quaisquer caracteres que possam estar ocultos nos rótulos de suas variáveis ​​à lista na 5ª linha:"local chars "..." " e fará as alterações para você:

****************! 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

Você também pode considerar dar uma olhada em Transferência de estatísticas e seus recursos de conversão de arquivos de dados Stata em R.

Ao usar o pacote Haven:

se o conjunto de dados que você está importando for pesado, a visualização dos dados no Rstudio pode não ser a ideal.

Em vez disso, você pode obter um data.frame com nomes de colunas, rótulos de colunas e um indicador para saber se a coluna está rotulada:

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) )

Observação:precisa usar as.characted para evitar que NULL nos rótulos sejam eliminados e, portanto, acabe com comprimentos de vetor diferentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top