如何将 dplyr SE 与 "invalid" 名称(即包含空格)一起使用?

How to use dplyr SE with "invalid" names (ie containing spaces)?

我不知道如何使用带有无效变量名的 SE dplyr 函数,例如 selecting 一个带有 space 的变量。

示例:

df <- dplyr::data_frame(`a b` = 1)
myvar <- "a b"

如果我想 select a b 变量,我可以使用 dplyr::select(df, `a b`) 来实现,但是我如何使用 select_ 来实现?

我想我只需要找到一个 "wraps" 反引号字符串的函数,这样我就可以调用 dplyr::select_(df, backtick(myvar))

正如 MyFlick 在评论中所说,通常应避免这种行为,但如果你想让它起作用,你可以制作自己的反引号包装器

backtick <- function(x) paste0("`", x, "`")
dplyr::select_(df, backtick(myvar))

编辑:Hadley 回复了我关于此的推文,并向我展示了只需使用 as.name 即可解决此问题,而不是使用反引号:

df <- dplyr::data_frame(`a b` = 1)
myvar <- "a b"
dplyr::select_(df, as.name(myvar))

我的解决方案是利用 select 的能力来使用列 positionsas.name 解决方案似乎不适用于我的某些专栏。

select(df, which(names(df) %in% myvar))

如果已经在管道中,则更简洁:

df %>%
 select(which(names(.) %in% myvar))

虽然这使用了select,但在我看来它并不依赖于 NSE。

请注意,如果没有匹配项,所有列都将被删除,不会出现错误或警告。