wie man Variablennamen und Beschriftungen von sas7bdat in einen data.frame bekommt

Dec 16 2020

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

4 vikjam Dec 16 2020 at 10:56

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