Использование формулы R с dplyr

#r #dataframe #dplyr #formula

#r #фрейм данных #dplyr #формула

Вопрос:

Я пишу функцию, которая принимает формулу и использует различные элементы этой формулы для управления фреймом данных. Я сталкиваюсь с проблемами, когда пытаюсь использовать dplyr (я думаю, это из-за чего-то, называемого «нестандартной оценкой»).

Например, я хочу сослаться на столбец во фрейме данных df , используя элементы в формуле. Если я сохраню формулу как form и захочу получить доступ к столбцу df , названному в честь первого элемента form , я могу написать:

df[all.vars(form)[1]] .

К сожалению, следующее не работает:

 df %>% filter(all.vars(form)[1]) < 100).
  

Как бы я мог ссылаться на переменную таким образом, используя dpylr ? Я пробовал несколько таких вещей, rlang::sym но не имел никакой удачи.

Ответ №1:

Мы могли бы использовать across , который может содержать один или несколько столбцов

 library(dplyr)
df %>%
    filter(across(all.vars(form), ~ . < 100))
  

Если это один столбец

 df %>% 
     filter(across(all.vars(form)[1], ~ . < 100))
  

Или другой вариант rlang::sym с !!

 df %>%
     filter(!! rlang::sym(all.vars(form)[1]))
  

Вывод all.vars является character классом, и мы преобразуем его в sym bol и оцениваем ( !! )


Используя небольшой воспроизводимый пример

 data(mtcars)
form <- mpg ~ cyl
mtcars %>%
      filter(!! rlang::sym(all.vars(form)[1]) < 15)
#                      mpg cyl disp  hp drat    wt  qsec vs am gear carb
#Duster 360          14.3   8  360 245 3.21 3.570 15.84  0  0    3    4
#Cadillac Fleetwood  10.4   8  472 205 2.93 5.250 17.98  0  0    3    4
#Lincoln Continental 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4
#Chrysler Imperial   14.7   8  440 230 3.23 5.345 17.42  0  0    3    4
#Camaro Z28          13.3   8  350 245 3.73 3.840 15.41  0  0    3    4