Удобный способ доступа к метке переменных после импорта данных Stata с помощью гавани
В R некоторые пакеты (например, haven
) вставить label
атрибуты для переменных (например, haven
), который объясняет основное имя переменной. Например, gdppc
может иметь ярлык GDP per capita
,
Это чрезвычайно полезно, особенно при импорте данных из Stata. Тем не менее, я все еще пытаюсь понять, как использовать это в моем рабочем процессе.
Как быстро просмотреть переменную и метку переменной? Прямо сейчас я должен сделать
attributes(df$var)
, но это вряд ли удобно, чтобы мельком увидеть (а-ляnames(df)
)Как использовать эти метки на участках? Опять же я могу использовать
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
Пакет также полезен для отображения меток переменных и значений.