dplyr:使用 rename_ 重命名变量

dplyr: Renaming variables with rename_

我正在尝试重命名链中的几个变量:

df_foo = data_frame(
  a.a = 1:10,
  "b...b" = 1:10,
  "cc..d" = 1:10
)

df_foo %>% 
  rename_(
    .dots = setNames(
      names(.),
      gsub("[[:punct:]]", "", names(.)))
  )

这工作正常,但是当其中一个变量的名称中有 space 时:

df_foo = data_frame(
  a.a = 1:10,
  "b...b" = 1:10,
  "c c..d" = 1:10
)

df_foo %>% 
  rename_(
    .dots = setNames(
      names(.),
      gsub("[[:punct:]]", "", names(.)))
  )

我收到此错误:

Error in parse(text = x) : <text>:1:3: unexpected symbol
1: c c..d
      ^

我不确定这是从哪里来的,因为我 运行 gsub 直接:

setNames(
      names(df_foo),
      gsub("[[:punct:]]", "", names(df_foo)))

我没有收到错误。不确定这里发生了什么。


这现在在 dplyr GH 问题页面上作为 issue #2391 提出。

总的来说:我强烈建议您不要使用带空格的变量名。它们很痛苦,而且往往会造成比其价值更多的麻烦。

这里是这个错误的原因。

rename_ 派遣到 dplyr:::rename_.data.frame。该函数的第一行是:

dots <- lazyeval::all_dots(.dots, ...)

然后 lazyeval 函数将调用 lazyeval::as.lazy_dots,后者使用 lazyeval::as.lazy,后者本身使用 lazyeval:::as.lazy.character,后者调用 lazy_(parse(text = x)[[1]], env)。现在,parse() 期望有效的 R 表达式作为其文本参数:

text: character vector. The text to parse. Elements are treated as if they were lines of a file. (from help("parse"))

这就是为什么 rename_ 似乎不喜欢带空格的字符向量,我们得到 "Error in parse(text = x)":

lazyeval:::as.lazy(names(df_foo)[2])
<lazy>
  expr: b...b
  env:  <environment: base>
lazyeval:::as.lazy(names(df_foo)[3])
Error in parse(text = x) : <text>:1:3: unexpected symbol
1: c c..d
      ^

除了使用 base 进行简单的重命名之外,我不知道其他解决方案。