Как удалить столбцы путем передачи имени переменной с помощью 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)
Обратите внимание на отсутствие кавычек в имени столбца, который вы хотите удалить (привет). Кроме того, чтобы удалить несколько столбцов, просто поместить ,
после привет и добавить второй столбец.