【问题标题】:How NOT to select columns using select() dplyr when you have character vector of colnames?当您有 colnames 的字符向量时,如何不使用 select() dplyr 选择列?
【发布时间】:2018-09-09 23:27:58
【问题描述】:

我正在尝试使用 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 接受不带引号的值,但我无法以这种方式进行子选择。

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

谢谢,

优先级

【问题讨论】:

  • select(-x) 应该可以工作
  • @Prerit:SO 要求您使用edit 功能,避免使用 cmets 修改或澄清您的问题。 (我不是反对者。)
  • 这在文档和示例中
  • @42 完成!编辑了问题

标签: r dplyr


【解决方案1】:

编辑: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"   

附:将引用的值传递给dplyr 很奇怪,它的一大优点是您不必 必须一直输入引号。如您所见,裸值适用于 dplyrggplot2

【讨论】:

  • 你说这很“好”,但我觉得它非常令人困惑。在常规 R 中,您需要在除公式之外的所有内容中引用列名,而在 tidyverse 中,不接受引用的列名。这真的是一种不同的语言。 (我不认为有人会尝试这样做很“奇怪”。相反,我认为这是完全自然的。)
  • 当然,您完全正确。在这两种风格之间切换对我来说没什么大不了的(当上下文从 Tidyverse 变为 base R 时,这对我来说很明显),但对于新人来说,同时学习这两种范式可能会很困难。这就是为什么我觉得在进入 Tidyverse 之前对基础 R 有一个有效的理解很重要,它清楚地表明 Tidyverse 是规则的例外。
  • 问题是我知道这很奇怪,但是我以一个字符向量结束,我不知道如何使用 select() 进行选择,我不想在我的 tibble 中有这些列。如果它不起作用,我将使用解决方法来解决它。 :)
  • 主要问题是我以一个字符向量结尾,还有其他的东西,比如 rlang::expr 等,但看起来很奇怪和不自然。
  • 这是你第一次提到字符向量,这是你应该放入你的 reprex 的东西,否则你问的问题实际上不是你的问题......
猜你喜欢
  • 2017-11-28
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2017-06-19
  • 2018-07-03
相关资源
最近更新 更多