【问题标题】:Select column that may not exist without error, using standard evaluation使用标准评估选择可能不存在且没有错误的列
【发布时间】:2019-03-07 01:46:39
【问题描述】:

我想选择一个可能存在也可能不存在的列,如果该列丢失且没有错误,则让它简单地返回所有其他列。这适用于非标准评估,但不适用于 tidyverse 函数select_ 的标准评估。

例如,以下内容按预期工作:

iris %>%
  select(Sepal.Length, Sepal.Width, contains("banana"))

    Sepal.Length Sepal.Width
1            5.1         3.5
2            4.9         3.0
3            4.7         3.2
4            4.6         3.1
...

但是使用标准评估(我需要使用它在包中发布它)这不起作用:

iris %>%
  select_("Sepal.Length", "Sepal.Width", contains("banana"))

Error: No tidyselect variables were registered

我意识到破坏的版本有什么问题,但我不确定使用 tidyverse 功能有哪些替代方案。

【问题讨论】:

  • 我会避免在一个包中完全使用select,第一个版本使用NSE,而不是第二个,你为什么要使用select_
  • 我想?您的术语可能是落后的:即select() 使用 NSE,而 select_ 使用 标准 评估(即非 NSE)...
  • 如果目标是select("Sepal.Length", "Sepal.Width", contains("banana")),您可以在select() 中使用字符串。另见select_at()
  • 本,我的术语是错误的。我的意思是使用标准评估。

标签: r tidyverse


【解决方案1】:

如果你愿意离开tidyverse,你可以对列名进行显式操作:

iris[intersect(names(iris), c("Sepal.Length","Sepal.Width","banana"))]

对于contains(),您可以使用grep

ccols <- c("Sepal.Length", "Sepal.Width", 
           grep("banana", names(iris), value=TRUE))
iris[ccols]

如果您用变量引用替换字符串,这仍然有效(因为它是 标准 评估),即:

x <- "banana"
ccols <- c("Sepal.Length", "Sepal.Width", 
           grep(x, names(iris), value=TRUE))
iris[ccols]

【讨论】:

  • 我觉得你需要value = TRUE
猜你喜欢
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
相关资源
最近更新 更多