我正在尝试使用dplyr取消选择数据集中的列,但自昨晚以来我无法实现这一目标。
我很清楚解决方法,但我正在严格尝试通过dplyr找到答案。
library(dplyr)
df <- tibble(x = c(1,2,3,4), y = c('a','b','c','d'))
df %>% select(-c('x'))
给我一个错误:-c(“x”)出错:一元运算符的参数无效
现在,我知道select接受了不带引号的值,但我无法以这种方式进行子选择。
请注意上面的数据集只是一个例子,我们可以有很多列。
谢谢,
Prerit
答案 0 :(得分:14)
编辑: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"
你应该看一下选择助手(类型?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)
因此,如果我想省略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"
但是,当然,实现这一目标的最佳和最简洁的方法是使用select
的辅助函数之一:
select(iris, -ends_with(".Length")) %>% colnames()
# [1] "Sepal.Width" "Petal.Width" "Species"
P.S。将引用的值传递给dplyr
是很奇怪的,其中一个重要的细节是你不必须一直输入引号。如您所见,裸值适用于dplyr
和ggplot2
。