выбор диапазонов столбцов через sym и enquo с помощью dplyr::select

#r #dplyr #rlang

#r #dplyr #rlang

Вопрос:

BLUP: Возможно ли использовать sym / enquo для передачи диапазонов столбцов в dplyr::select ?

Рассмотрим следующую проблему со столбцами A — E:

 library(tibble)
library(dplyr)
set.seed(4)
d = as_tibble(setNames(as.list(rnorm(5)), LETTERS[1:5]))
d
## # A tibble: 1 x 5
##       A      B     C     D     E
##   <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 0.217 -0.542 0.891 0.596  1.64
  

Я могу выбрать диапазон столбцов, используя оператор столбца : , например

 select(d, B:D)
## # A tibble: 1 x 3
##        B     C     D
##    <dbl> <dbl> <dbl>
## 1 -0.542 0.891 0.596
  

Я даже могу передать этот диапазон в качестве запроса:

 cols = quo(B:D)
select(d, !!cols)
# same result as above
  

Но я не могу передать это как символ:

 colsym = sym("B:D")
select(d, !!enquo(colsym))
## Error in .f(.x[[i]], ...) : object 'A:C' not found
  

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

В моем реальном примере я выбираю несколько диапазонов из 20-40 столбцов, поэтому я хотел бы придерживаться использования : оператора, а не выписывать несколько векторов из 20-40 элементов и использовать enquos (что, я полагаю, сработало бы, но я не тестировал это).

Ответ №1:

Вы пытаетесь передать несинтаксическое имя B:D в виде символа — то, что вам нужно, это выражение. Вы можете использовать rlang::parse_expr для преобразования строки в выражение:

 cols <- rlang::parse_expr("B:D")

select(d, !!cols)
## A tibble: 1 x 3
#       B     C     D
#   <dbl> <dbl> <dbl>
#1 -0.542 0.891 0.596
  

Комментарии:

1. Отлично, спасибо. Это отлично работает как для одного столбца ( parse_expr("B") ), так и для диапазонов ( parse_expr("B:D") )