wie man Variablennamen und Beschriftungen von sas7bdat in einen data.frame bekommt
Ich lese eine Reihe von sas-Daten in r. Ich frage mich, ob es einen Code gibt, mit dem ich den Variablennamen und die Variablenbezeichnung in einen data.frame bringe, oder etwas wie ein Codebuch.
Ich habe das Port-Paket verwendet, um Daten einzulesen
haven:read_sas
Ich frage mich, ob es Datenetiketten an einem Ort gespeichert hat. Wenn ja, kann ich es rausholen?
Die Daten in r sehen folgendermaßen aus:

Ich möchte einen data.frame erstellen, der folgendermaßen aussieht:

Fehlercodes:
<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(...)
Itr sieht so aus, als ob der Fehler durch Daten verursacht wurde, die so aussehen:

Beispieldaten können von erstellt werden
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")
Antworten
Diese Frage kann hilfreich sein: Extrahieren Sie das Label-Attribut aus "beschrifteten" Tibble-Spalten aus einem Port-Import aus Stata
Hier ist ein Beispiel:
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
Bearbeiten: Basierend auf den Kommentaren finden Sie hier ein Beispiel, wenn Sie die Beschriftungen für mehrere data.frames in einer Liste abrufen möchten, in der einige der data.frames keine Beschriftungen haben.
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