jak pobrać nazwę zmiennej i etykiety z sas7bdat do data.frame
Wczytuję zestaw danych SAS do r. Zastanawiam się, czy istnieje kod, którego używam, aby pobrać nazwę zmiennej i etykietę zmiennej do data.frame, czy coś takiego jak książka kodowa?
Użyłem pakietu Haven do wczytania danych
haven:read_sas
Zastanawiam się, czy zapisał etykiety danych w jakimś miejscu. jeśli tak, czy mogę to wyjąć?
Dane w r wyglądają następująco:

Chcę zbudować ramkę danych, która wygląda następująco:

kody błędów:
<error/purrr_error_bad_element_vector>
Result 6 must be a single string, not NULL of length 0
Backtrace:
x
1. +-base::debug(list_of_labels <- lapply(datasets, label_lookup_map))
2. +-base::lapply(datasets, label_lookup_map)
3. | \-global::FUN(X[[i]], ...)
4. | \-tibble::tibble(col_name = df %>% names(), labels = df %>% map_chr(attr_getter("label")))
5. | \-tibble:::tibble_quos(xs[!is_null], .rows, .name_repair)
6. | \-rlang::eval_tidy(xs[[j]], mask)
7. +-df %>% map_chr(attr_getter("label"))
8. | +-base::withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
9. | \-base::eval(quote(`_fseq`(`_lhs`)), env, env)
10. | \-base::eval(quote(`_fseq`(`_lhs`)), env, env)
11. | \-`_fseq`(`_lhs`)
12. | \-magrittr::freduce(value, `_function_list`)
13. | +-base::withVisible(function_list[[k]](value))
14. | \-function_list[[k]](value)
15. | \-purrr::map_chr(., attr_getter("label"))
16. \-purrr:::stop_bad_element_vector(...)
17. \-purrr:::stop_bad_vector(...)
18. \-purrr:::stop_bad_type(...)
Wygląda na to, że błąd został spowodowany przez dane, które wyglądają następująco:

przykładowe dane można zbudować według
df<- structure(list(VISITNUM = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 14, 14, 14, 14), EXDOSE = c(36, 109, 182, 182,
182, 182, 182, 55, 36, 55, 36, 55, 109, 182, 109, 182, 2600,
2600, 2600, 2600), EXDOSU = c("mg", "mg", "mg", "mg", "mg", "mg",
"mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg", "mg",
"mg", "mg", "mg")), label = "EX ", row.names = c(NA,
20L), class = "data.frame")
Odpowiedzi
Może Ci się przydać to pytanie: wyodrębnij atrybut labels z „etykietowanych” kolumn tibble z importu przystani ze Stata
Oto przykład:
library(haven)
library(tidyverse)
airline <- read_sas("http://www.principlesofeconometrics.com/sas/airline.sas7bdat")
label_lookup_map <- tibble(
col_name = airline %>% names(),
labels = airline %>% map_chr(attr_getter("label"))
)
print(label_lookup_map)
# # A tibble: 6 x 2
# col_name labels
# <chr> <chr>
# 1 YEAR year
# 2 Y level of output
# 3 W wage rate
# 4 R interest rate
# 5 L labor input
# 6 K capital input
Edycja: Na podstawie komentarzy, oto przykład, jeśli chcesz uzyskać etykiety dla wielu ramek data.frames na liście, na której niektóre ramki data.frames nie mają etykiet.
library(haven)
library(tidyverse)
airline <- read_sas("http://www.principlesofeconometrics.com/sas/airline.sas7bdat")
cola <- read_sas("http://www.principlesofeconometrics.com/sas/cola.sas7bdat")
data(iris)
list_of_tbl <- list(airline, cola, iris)
get_labels <- attr_getter("label")
has_labels <- function(df) {
!all(sapply(lapply(df, get_labels), is.null))
}
label_lookup_map <- function(df) {
df_labels <- NA
if (has_labels(df)) {
df_labels <- df %>% map_chr(get_labels)
}
tibble(
col_name = df %>% names,
labels = df_labels
)
}
list_of_labels <- lapply(list_of_tbl, label_lookup_map)
print(list_of_labels)
# [[1]]
# # A tibble: 6 x 2
# col_name labels
# <chr> <chr>
# 1 YEAR year
# 2 Y level of output
# 3 W wage rate
# 4 R interest rate
# 5 L labor input
# 6 K capital input
# [[2]]
# # A tibble: 5 x 2
# col_name labels
# <chr> <chr>
# 1 ID customer id
# 2 CHOICE = 1 if brand chosen
# 3 PRICE price of 2 liter soda
# 4 FEATURE = 1 featured item at the time of purchase
# 5 DISPLAY = 1 if displayed at time of purchase
# [[3]]
# # A tibble: 5 x 2
# col_name labels
# <chr> <lgl>
# 1 Sepal.Length NA
# 2 Sepal.Width NA
# 3 Petal.Length NA
# 4 Petal.Width NA
# 5 Species NA