Использование меток переменных Stata в R

У меня есть куча файлов Stata.dta, которые я хотел бы использовать в R.

Моя проблема в том, что имена переменных мне не помогают, поскольку они похожи на "q0100", "q0565", "q0500" и "q0202". Тем не менее, они помечены как "psu", "число беременных", "глава семьи" и "путевая точка".

Я хотел бы иметь возможность захватить метки ( "psu", "waypoint" и т.д.) и использовать их в качестве имен переменных/столбцов, так как мне будет легче работать.

Есть ли способ сделать это, либо предпочтительно в R, либо через Stata? Я знаю read.dta в библиотеке (чужой), но не знаю, может ли он преобразовать метки в имена переменных.

Ответы

Ответ 1

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 файл не имеет очень интересных ярлыков, но ваш должен быть более значимым.

Ответ 2

Вы можете преобразовать метки переменных в имена переменных из Stata, прежде чем экспортировать их в R или текстовый файл.
Как упоминает Ян, переменные метки обычно не делают хороших имен переменных, но если вы преобразуете пробелы и другие символы в подчеркивания, и если ваши метки переменных не слишком длинны, вы можете легко перемаркировать ваши vars с помощью 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

Здесь функция для оценки любого выражения, которое вы хотите использовать с метками переменной 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(...))) или все, что хотите.

Подробнее см. этот поток.

Ответ 4

Я бы порекомендовал вам использовать новый пакет haven (GitHub)  для импорта ваших данных.

Как Хэдли Викем упоминает в файл README.md:

Вы всегда получаете фрейм данных, время даты преобразуется в соответствующие классы R, а помеченные векторы возвращаются как новый помеченный класс. Вы можете легко принуждать к факторам или заменять обозначенные значения пропущенными, если это необходимо. Если вы также используете dplyr, вы заметите, что большие кадры данных печатаются удобным способом.

(акцент мой)

Если вы используете RStudio, это автоматически отображает метки под именами переменных в панели просмотра View("data.frame") (источник).

Переменные ярлыки привязываются как атрибут к каждой переменной. Они не печатаются (потому что они имеют тенденцию быть длинными), но если у вас есть предварительная версия RStudio, вы увидите их в обновленной панели просмотра.

Вы можете установить пакет, используя:

install.packages("haven")

и импортируйте дату Stata, используя:

read_dta("path/to/file")

Подробнее см.:

help("read_dta")