dplyr:使用rename_重命名变量

时间:2017-01-29 12:52:34

标签: r dplyr gsub

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

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(.)))
  )

这样可以正常工作,但当其中一个变量的名称中有空格时:

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

1 个答案:

答案 0 :(得分:3)

一般来说:我强烈建议你永远不要在空格中使用变量名。它们很痛苦,经常会造成比它们更值钱的麻烦。

以下是此错误的原因。

rename_发送给dplyr:::rename_.data.frame。该功能的第一行是:

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

lazyeval函数会调用lazyeval::as.lazy_dotslazyeval::as.lazy使用lazyeval:::as.lazy.characterlazy_(parse(text = x)[[1]], env)本身使用调用parse()的{​​{1}}。现在,help("parse")期望有效的R表达式作为其文本参数:

  

文字:字符向量。要解析的文本。元素被视为文件的行。 (来自rename_

这就是为什么parse(text = x)似乎不喜欢带有空格的字符向量,我们得到了lazyeval:::as.lazy(names(df_foo)[2]) &#34;

中的错误
<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
      ^
{{1}}

我不知道某个解决方案,只有使用base才能进行这种简单的重命名。