当某些变量缺少标签时,在R中提取Stata标签

时间:2018-08-18 19:23:22

标签: r attributes label r-haven

我正在处理带有变量名和标签的大型Stata文件。我需要这些标签来了解每个变量是什么。

我一直在使用

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

提取变量名称和相关标签。不幸的是,某些数据集的变量缺少任何标签(请参见下图)。

enter image description here

这意味着当我尝试上面的代码时,我只会得到一个错误。

Error: Result 1 is not a length 1 atomic vector

理想情况下,我可以将所有缺少的标签都称为“ NA”,或者什么也不要,因此我可以获得这样的输出:

enter image description here

仅具有缺失值的变量根本没有标签,但仍包含在内。

2 个答案:

答案 0 :(得分:1)

您可以先传递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)

答案 1 :(得分:1)

我觉得purrr的严格性妨碍了您在这里的需求。如果您只是CancelledError(或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()