2017-01-24 1 views
7

У меня есть ФР следующим образом:Как удалить столбцы, переместив имя переменной с помощью dplyr?

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 

ответ

18

Вы можете использовать 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 
+0

простой вопрос - как правило, когда имена столбцов в строках, то мы используем 'выбрать _()' версия право? когда я пробовал это, не работал –

+0

спасибо. Мне нравится решение select_. – HappyCoding

+0

спасибо! @Psidom –

3

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

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

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

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

1

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

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

несколько больше возможностей:

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