Как удалить столбцы путем передачи имени переменной с помощью dplyr?

У меня есть df следующим образом:

a <- data_frame(keep=c("hello", "world"),drop = c("nice", "work"))
a
Source: local data frame [2 x 2]
   keep  drop
  (chr) (chr)
1 hello  nice
2 world  work

Я могу использовать a %>% select(-drop), чтобы удалить столбец без проблем. однако, если я хочу передать переменную, чтобы представить столбец drop, тогда он возвращает ошибку.

name <- "drop"
a  %>% select(-(name))
Error in -(name) : invalid argument to unary operator

Ответ 1

Вы можете использовать one_of, чтобы найти позиции столбца, а затем использовать -, чтобы удалить его, select(-one_of(name)), если вы проверите ?select, использование документа описано в разделе "Переменная" в примерах:

name <- "drop"
a %>% select(-one_of(name))

# A tibble: 2 × 1
#   keep
#  <chr>
#1 hello
#2 world

Или с помощью select_ вам нужно вставить - с именами столбцов, чтобы удалить их и передать имена вставленных столбцов в параметр .dots, если удалено более одного столбца:

name <- "drop"
a %>% select_(.dots = paste("-", name))

# A tibble: 2 × 1
#   keep
#  <chr>
#1 hello
#2 world

Ответ 2

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

a <- data_frame(keep=c("hello", "world"),drop = c("nice", "work"))
select(a, -starts_with('drop'))
#   Source: local data frame [2 x 1]
#
#   keep
#   (chr)
# 1 hello
# 2 world

Вы должны искать некоторые ранее написанные решения тоже. Пожалуйста, прочитайте документ здесь. Выбор/переименование переменных по имени. DPLYR

Я надеюсь, что это сделает вашу работу :) @Psidom спасибо за обновление вашего ответа... но я также буду запрашивать голосовавших за меня голосовавших, так как я недавно стал активным пользователем и все еще должен получить базовые привилегии на stackoverflow.

Ответ 3

Мы можем использовать select с setdiff

a %>%
    select_(setdiff(names(.), name))
# A tibble: 2 × 1
#   keep
#   <chr>
#1 hello
#2 world

Ответ 4

Еще несколько возможностей:

name <- "drop"
a %>% '[<-'(name, value=NULL)
a %>% magrittr::inset(name,value=NULL)
a %>% purrr::modify_at(name,~NULL)

Ответ 5

Я мог заставить эти решения работать, сначала разгруппировав данные с помощью ungroup:

df <- df  %>%  ungroup  %>%  select(-hello)

Обратите внимание на отсутствие кавычек в имени столбца, который вы хотите удалить (привет). Кроме того, чтобы удалить несколько столбцов, просто поместить , после привет и добавить второй столбец.