如何通过使用dplyr传递变量名来删除列?

时间:2017-01-24 03:14:32

标签: r 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

5 个答案:

答案 0 :(得分:33)

您可以使用one_of查找列位置,然后使用-删除它select(-one_of(name)),如果您选中?select,则会在< em>删除示例中的变量部分:

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

答案 1 :(得分:8)

您可以简单地使用

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

您还必须搜索以前编写的一些解决方案。请在此处阅读文档Select/rename variables by name.DPLYR

我希望能帮到你的工作:) @Psidom thanx用于更新你的答案..但是我也会请求upvoters投票给我,因为我最近成为了一个活跃的用户,但我仍然要获得stackoverflow的基本权限。

答案 2 :(得分:4)

我们可以将selectsetdiff

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

答案 3 :(得分:3)

还有一些可能性:

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

答案 4 :(得分:0)

我只能通过首先使用ungroup对数据进行分组来使这些解决方案起作用:

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

请注意,要删除的列名称上没有引号(您好)。另外,要删除多列,只需在您好之后放置,并添加第二列。