Извлечение меток Stata в R, если в некоторых переменных отсутствуют метки

Я работаю с большими файлами Stata с именами переменных и метками. Мне нужны эти ярлыки, чтобы понять, что такое каждая переменная.

Я использую

df[] %>% map_chr(~attributes(.)$label)

извлечь имена переменных и связанные метки. К сожалению, в некоторых наборах данных есть переменные, в которых отсутствует какая-либо метка (см. Рисунок ниже).

введите описание изображения здесь

Это означает, что когда я пробую приведенный выше код, я просто получаю сообщение об ошибке.

Error: Result 1 is not a length 1 atomic vector

В идеале у меня был бы способ назвать все отсутствующие метки "NA", или ничего, поэтому я мог бы получить такой результат:

введите описание изображения здесь

#

Только там, где переменные с пропущенными значениями просто не имеют метки, но все еще включены.

2 ответа

Решение

Я чувствую, что строгость мурлыканья мешает тому, что вы хотите здесь. Если вы просто lapply() (или же purrr::map()), вы получите список, с которым прекрасно работать:

# get an example Stata dataset
webuse::webuse("auto")

# drop the label on `price`
attr(auto$price, "label") <- NULL

# get all of the labels as a list
labels <- lapply(auto, attr, "label")

Это дает вам:

> str(labels)
List of 12
 $ make        : chr "Make and Model"
 $ price       : NULL
 $ mpg         : chr "Mileage (mpg)"
 $ rep78       : chr "Repair Record 1978"
 $ headroom    : chr "Headroom (in.)"
 $ trunk       : chr "Trunk space (cu. ft.)"
 $ weight      : chr "Weight (lbs.)"
 $ length      : chr "Length (in.)"
 $ turn        : chr "Turn Circle (ft.) "
 $ displacement: chr "Displacement (cu. in.)"
 $ gear_ratio  : chr "Gear Ratio"
 $ foreign     : chr "Car type"

Вы можете unlist() что если вы хотите исключить метки для переменных, у которых нет меток:

> unlist(labels)
                    make                      mpg                    rep78                 headroom 
        "Make and Model"          "Mileage (mpg)"     "Repair Record 1978"         "Headroom (in.)" 
                   trunk                   weight                   length                     turn 
 "Trunk space (cu. ft.)"          "Weight (lbs.)"           "Length (in.)"     "Turn Circle (ft.) " 
            displacement               gear_ratio                  foreign 
"Displacement (cu. in.)"             "Gear Ratio"               "Car type"

Вы можете просто сделать пропуск map с последующим map_chrт.е.

library(haven)
library(dplyr)
library(purrr)

dat <- read_dta("http://data.princeton.edu/wws509/datasets/salary.dta")

attributes(dat$yr)$label <- NULL
dat %>% map_chr(~attributes(.)$label)
# Error: Result 3 is not a length 1 atomic vector

dat %>% 
  map(~attributes(.)$label) %>%
  map_chr(~ifelse(is.null(.), NA, .))
#                                  sx                                  rk 
#          "Sex (coded 1 for female)"                              "Rank" 
#                                  yr                                  dg 
#                                  NA             "Highest degree earned" 
#                                  yd                                  sl 
# "Years since highest degree earned"   "Academic year salary in dollars"

или эквивалентно

dat %>%
  map(~attributes(.)) %>%
  map_chr("label", .default = NA)
Другие вопросы по тегам