Değişken adı ve etiketleri sas7bdat'ten data.frame'e nasıl alınır

Dec 16 2020

R'ye bir dizi sas verisi okuyorum. Değişken adını ve değişken etiketini bir data.frame içine almak için kullandığım bir kod var mı, yoksa bir kod kitabı gibi mi merak ediyorum?

Verileri okumak için sığınak paketi kullandım

haven:read_sas

Veri etiketlerini bir yere kaydedip kaydetmediğini merak ediyorum. eğer öyleyse, onu çıkarabilir miyim?

R'deki veriler şuna benzer:

Şuna benzeyen bir data.frame oluşturmak istiyorum:

hata kodları:

<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, hatanın aşağıdaki gibi görünen bir veriden kaynaklanmış gibi görünüyor:

örnek veriler şu şekilde oluşturulabilir:

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")

Yanıtlar

4 vikjam Dec 16 2020 at 10:56

Bu soruyu yararlı bulabilirsiniz: Stata'dan içe aktarılmış bir sığınaktan "etiketli" tibble sütunlarından etiketler özelliğini çıkarın.

İşte bir örnek:

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

Düzenleme: Yorumlara dayalı olarak, bazı data.frame'lerin etiketlerinin olmadığı bir listede birden fazla data.frame için etiket almak istiyorsanız bir örnek aşağıda verilmiştir.

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