重命名包含空格的列时,dplyr rename_会产生错误

时间:2015-06-12 04:27:06

标签: r dplyr

rename_按预期用于非病理列名称

%>% rename_(foo = 'testcol')

但是如果我想重命名一个有空格的列呢?

%>% rename_(foo = 'test col')

我收到错误消息:

Error in parse(text = x) (from #12) : <text>:1:6: unexpected symbol

我可以使用make.names但是如果没有额外的步骤,是否无法重命名列?

2 个答案:

答案 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函数在内部使用lazyevallazyeval::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" )