当你有colnames的字符向量时,如何不使用select()dplyr选择列?

Pre*_*rit 14 r dplyr

我试图使用dplyr取消选择我的数据集中的列,但自昨晚以来我无法实现这一点.

我很清楚工作,但我正在严格尝试通过dplyr找到答案.

library(dplyr)
df <- tibble(x = c(1,2,3,4), y = c('a','b','c','d'))
df %>% select(-c('x'))
Run Code Online (Sandbox Code Playgroud)

给我一个错误:-c("x")出错:一元运算符的参数无效

现在,我知道select接受了不带引号的值,但我无法以这种方式进行子选择.

请注意上面的数据集只是一个例子,我们可以有很多列.

谢谢,

Prerit

Duc*_*mas 23

编辑:OP的实际问题是如何使用字符向量从数据框中选择或取消选择列.使用one_of()辅助函数:

colnames(iris)

# [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

cols <- c("Petal.Length", "Sepal.Length")

select(iris, one_of(cols)) %>% colnames

# [1] "Petal.Length" "Sepal.Length"

select(iris, -one_of(cols)) %>% colnames

# [1] "Sepal.Width" "Petal.Width" "Species"
Run Code Online (Sandbox Code Playgroud)

你应该看一下选择助手(类型?select_helpers),因为它们非常有用.来自文档:

starts_with():以前缀开头

ends_with():以前缀结尾

contains():包含文字字符串

matches():匹配正则表达式

num_range():数值范围,如x01,x02,x03.

one_of():字符向量中的变量.

everything():所有变量.


给定一个列名为a:z的数据框,请使用select如下:

select(-a, -b, -c, -d, -e)

# OR

select(-c(a, b, c, d, e))

# OR

select(-(a:e))

# OR if you want to keep b

select(-a, -(c:e))

# OR a different way to keep b, by just putting it back in

select(-(a:e), b)
Run Code Online (Sandbox Code Playgroud)

因此,如果我想省略iris数据集中的两个列,我可以说:

colnames(iris)

# [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

select(iris, -c(Sepal.Length, Petal.Length)) %>% colnames()

# [1] "Sepal.Width" "Petal.Width" "Species" 
Run Code Online (Sandbox Code Playgroud)

但是,当然,实现这一目标的最佳和最简洁的方法是使用其中一个select辅助函数:

select(iris, -ends_with(".Length")) %>% colnames()

# [1] "Sepal.Width" "Petal.Width" "Species"   
Run Code Online (Sandbox Code Playgroud)

PS你把引用的值传递给它很奇怪dplyr,其中一个很大的细节就是你不必一直输入引号.正如您所看到的,裸值可以dplyr和ggplot2.

  • 当然,你完全正确.在两种风格之间切换对我来说并不是什么大不了的事情(当上下文从Tidyverse变为基础R时,这对我来说很明显),但新人们很难一起学习这两种范式.这就是为什么我觉得在跳入Tidyverse之前对基础R有一个有效的理解是很重要的,它清楚地表明Tidyverse是规则的例外. (2认同)
  • 这是你第一次提到字符向量,这是你应该放入你的 reprex 的东西,否则你问的问题实际上不是你的问题...... (2认同)