rename_
按预期用于非病理列名称
%>% rename_(foo = 'testcol')
但是如果我想重命名一个有空格的列呢?
%>% rename_(foo = 'test col')
我收到错误消息:
Error in parse(text = x) (from #12) : <text>:1:6: unexpected symbol
我可以使用make.names
但是如果没有额外的步骤,是否无法重命名列?
答案 0 :(得分:9)
您可以尝试使用backquotes
%>% rename(foo = `test col`)
使用可重现的例子
library(dplyr)
df %>%
rename(foo = `test col`) %>%
head(3)
# Col1 foo
#1 -0.5458808 C
#2 0.5365853 N
#3 0.4196231 R
或者使用rename_
(虽然我不确定这是否是正确的语法,因为通常需要.dots
。)使用OP的帖子中的类似语法
df %>%
rename_(foo = quote(`test col`)) %>%
head(3)
# Col1 foo
#1 -0.5458808 C
#2 0.5365853 N
#3 0.4196231 R
set.seed(24)
df <- data.frame(Col1= rnorm(10), 'test col' = sample(LETTERS, 10),
check.names=FALSE)
答案 1 :(得分:3)
以下是此行为的根本原因。要解决这个问题,@ akrun的答案可能更合适。
大多数dplyr
函数在内部使用lazyeval
。 lazyeval::as.lazy
的字符方法无法处理空格。可能的解决方法是添加around character strings with spaces inside
as.lazy.character`。
require(lazyeval)
as.lazy.character <- function (x, env = baseenv()){
if (grepl(pattern = "[:space:]", x) & !grepl(pattern = "`", x))
x <- paste0("`", x, "`")
lazy_(parse(text = x)[[1]], env)
}
或者更好(来自@ hadley的建议)
as.lazy.character <- function (x, env = baseenv()){
if (grepl(pattern = "[:space:]", x) & !grepl(pattern = "`", x))
return(as.lazy(as.name(x), env))
lazy_(parse(text = x)[[1]], env)
}
修复了rename_
以及内部使用as.lazy
的任何其他功能:
dplyr::select_vars_(names(df), "test col")
dplyr::rename_(df, foo="test col")
dplyr::mutate_(df, "foo" = "test col" )