是否可以根据变量标签 select 列?

Is it possible to select columns based on variable labels?

对于非常广泛的数据集,是否可以对 select 列使用变量标签?

library(expss)
data(mtcars)
mtcars = apply_labels(mtcars,
                      mpg = "Miles/(US) gallon",
                      cyl = "Number of cylinders",
                      disp = "Displacement (cu.in.)",
                      hp = "Gross horsepower",
                      drat = "Rear axle ratio",
                      wt = "Weight (1000 lbs)",
                      qsec = "1/4 mile time",
                      vs = "Engine",
                      vs = c("V-engine" = 0,
                             "Straight engine" = 1),
                      am = "Transmission",
                      am = c("Automatic" = 0,
                             "Manual"=1),
                      gear = "Number of forward gears",
                      carb = "Number of carburetors"
)
mtcars %>% 
  select(contains("Miles"))

这不起作用,因为它在列名中查找。它可以查看标签吗?

编辑:除了明显的将标签转换为列名之外,我应该补充一点。

我们可以得到 attributes 'label',检查 'Miles'

library(dplyr)
library(stringr)
mtcars %>% 
   select(where(~ str_detect(attributes(.)$label, 'Miles')))

-输出

#                      mpg
#Mazda RX4           21.0
#Mazda RX4 Wag       21.0
#Datsun 710          22.8
#Hornet 4 Drive      21.4
#Hornet Sportabout   18.7
#Valiant             18.1
#Duster 360          14.3
#Merc 240D           24.4
#Merc 230            22.8
#Merc 280            19.2
#Merc 280C           17.8
#Merc 450SE          16.4
# ..

或使用base R(使用R 4.1.0),使用lapply遍历列,提取labels属性,使用grep到return 匹配 pattern 'Miles' 的元素,获取 names 并在 select of subset

中使用它
mtcars |>  
    lapply(\(x) attributes(x)$label) |> 
    grep(pattern = 'Miles', value = TRUE) |> 
    names() |>
    {\(x) subset(mtcars, select = x)}()

-输出

#                      mpg
#Mazda RX4           21.0
#Mazda RX4 Wag       21.0
#Datsun 710          22.8
#Hornet 4 Drive      21.4
#Hornet Sportabout   18.7
#Valiant             18.1
#Duster 360          14.3
#Merc 240D           24.4
#Merc 230            22.8
#Merc 280            19.2
# ...