Удобный способ доступа к метке переменных после импорта данных Stata с помощью гавани

В R некоторые пакеты (например, haven) вставить label атрибуты для переменных (например, haven), который объясняет основное имя переменной. Например, gdppc может иметь ярлык GDP per capita,

Это чрезвычайно полезно, особенно при импорте данных из Stata. Тем не менее, я все еще пытаюсь понять, как использовать это в моем рабочем процессе.

  1. Как быстро просмотреть переменную и метку переменной? Прямо сейчас я должен сделать attributes(df$var), но это вряд ли удобно, чтобы мельком увидеть (а-ля names(df))

  2. Как использовать эти метки на участках? Опять же я могу использовать attr(df$var, "label") чтобы получить доступ к метке строки. Тем не менее, это кажется громоздким.

Есть ли официальный способ использовать эти метки в рабочем процессе? Я, конечно, могу написать пользовательскую функцию, которая оборачивается вокруг attr, но это может сломаться в будущем, когда пакеты реализуют label приписывать по-разному. Таким образом, в идеале я бы хотел, чтобы официальный путь haven (или другие крупные пакеты).

6 ответов

Решение с мурлыкающим пакетом от Tidyverse:

df %>% map_chr(~attributes(.)$label)

Использование sapply в простой функции для возврата списка переменных, как в окне переменных Stata:

library(dplyr)
makeVlist <- function(dta) { 
     labels <- sapply(dta, function(x) attr(x, "label"))
      tibble(name = names(labels),
             label = labels)
}

Это одно из нововведений, адресованных в Рио (полное раскрытие: я написал этот пакет). По сути, он предоставляет различные способы импорта меток переменных, в том числе обычные и чужие. Вот тривиальный пример:

Начните с создания воспроизводимого примера:

> library("rio")
> export(iris, "iris.dta")

Импортировать используя foreign::read.dta() (с помощью rio::import()):

> str(import("iris.dta", haven = FALSE))
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, "datalabel")= chr ""
 - attr(*, "time.stamp")= chr "15 Jan 2016 20:05"
 - attr(*, "formats")= chr  "" "" "" "" ...
 - attr(*, "types")= int  255 255 255 255 253
 - attr(*, "val.labels")= chr  "" "" "" "" ...
 - attr(*, "var.labels")= chr  "" "" "" "" ...
 - attr(*, "version")= int -7
 - attr(*, "label.table")=List of 1
  ..$ Species: Named int  1 2 3
  .. ..- attr(*, "names")= chr  "setosa" "versicolor" "virginica"

Читать в использовании haven::read_dta() используя собственные атрибуты переменных, потому что атрибуты хранятся на уровне data.frame, а не на уровне переменных:

> str(import("iris.dta", haven = TRUE, column.labels = TRUE))
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     :Class 'labelled'  atomic [1:150] 1 1 1 1 1 1 1 1 1 1 ...
  .. ..- attr(*, "labels")= Named int [1:3] 1 2 3
  .. .. ..- attr(*, "names")= chr [1:3] "setosa" "versicolor" "virginica"

Читать в использовании haven::read_dta() используя альтернативу, которую мы (разработчики rio) нашли более удобной:

> str(import("iris.dta", haven = TRUE))
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, "var.labels")=List of 5
  ..$ Sepal.Length: NULL
  ..$ Sepal.Width : NULL
  ..$ Petal.Length: NULL
  ..$ Petal.Width : NULL
  ..$ Species     : NULL
 - attr(*, "label.table")=List of 5
  ..$ Sepal.Length: NULL
  ..$ Sepal.Width : NULL
  ..$ Petal.Length: NULL
  ..$ Petal.Width : NULL
  ..$ Species     : Named int  1 2 3
  .. ..- attr(*, "names")= chr  "setosa" "versicolor" "virginica"

Перемещая атрибуты на уровень data.frame, к ним гораздо проще получить доступ, используя attr(data, "label.var")и т. д., а не копаться в атрибутах каждой переменной.

Примечание: значения атрибутов будут NULL, потому что я просто записываю собственный набор данных R в локальный файл, чтобы сделать это воспроизводимым.

Простое решение с маркированной упаковкой (Tidyverse)

descriptions <- var_label(data_raw) %>% 
  as_tibble() %>% 
  gather(key = variable, value = description)

Используйте пакет убежища, чтобы заставить фактор

haven::as_factor(df$var, levels="label")

Цель маркированного пакета - предоставить удобные функции для управления метками переменных и значений, импортированными с haven,

Кроме того, функции lookfor а также describe от questionr Пакет также полезен для отображения меток переменных и значений.

Другие вопросы по тегам