Удаление (или выбор отрицания) нескольких переменных, представленных вектором строк в dplyr - PullRequest
2 голосов
/ 05 августа 2020

У меня есть следующий фрейм данных

df = data.frame(a=c(1:10), b=c(2:11), c=c(2:13))

Пользователь указал вектор имен переменных в виде символов

user_cols = c('a', 'b')

I хотите взять вектор и использовать select (), чтобы переменные ссылались на вектор. Следующий код будет работать

df2 = df %>%
  select(!!!syms(user_cols))

Однако, если я хочу отбросить эту переменную, а не сохранять эти переменные, добавление отрицания (-) непосредственно в синтаксис НЕ будет работать:

df2 = df %>%
  select(-!!!syms(user_cols)) #Adding negation '-' hoping to de-select

Есть ли хороший способ выполнить эту операцию отбрасывания в dplyr?

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Просто используйте объект для select столбцов

library(dplyr)
df %>%
      select(user_cols)

Если нам нужно, в новой версии dplyr мы можем обернуть all_of

df %>%
   select(all_of(user_cols))
#    a  b
#1   1  2
#2   2  3
#3   3  4
#4   4  5
#5   5  6
#6   6  7
#7   7  8
#8   8  9
#9   9 10
#10 10 11

Или сбросить

df %>% 
   select(-all_of(user_cols))
#    c
#1   3
#2   4
#3   5
#4   6
#5   7
#6   8
#7   9
#8  10
#9  11
#10 12

ПРИМЕЧАНИЕ: мы можем использовать это напрямую, и никакие другие функции не нужны

Если мы хотим использовать код OP, просто оберните его c

df %>%
   select(-c(!!!syms(user_cols)))
#    c
#1   3
#2   4
#3   5
#4   6
#5   7
#6   8
#7   9
#8  10
#9  11
#10 12
1 голос
/ 05 августа 2020

Вы можете использовать setdiff:

df[setdiff(names(df), user_cols)]

Для использования с dplyr, select:

library(dplyr)
df %>% select(setdiff(names(.), user_cols))

#    c
#1   2
#2   3
#3   4
#4   5
#5   6
#6   7
#7   8
#8   9
#9  10
#10 11
...