dplyr:使用重命名重命名变量_

dplyr:使用重命名重命名变量_,r,dplyr,gsub,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 =

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

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
      ^
我没有得到一个错误。不知道这里发生了什么



现在在
dplyr
GH问题页面上提出了这个问题

一般来说:我强烈建议不要将变量名与空格连用。他们是一种痛苦,往往会造成更多的麻烦比他们的价值

下面是这个错误的原因

重命名
发送到
dplyr:::重命名..data.frame
。该函数的第一行是:

dots <- lazyeval::all_dots(.dots, ...)
分析时出错(text=x)::1:3:意外符号 1:c.c..d ^
我不知道有什么解决方案,除了使用base进行这个简单的重命名。

您愿意接受非dplyr解决方案吗?该软件包无法很好地处理变量名中的空格。@Hugh我想我已经有了非-dplyr解决方案,即直接在名称上运行
gsub
。我只想了解这里发生了什么。错误可以追溯到
lazyeval::as.lazy('aa')
返回解析错误。由于
dplyr
在内部严重依赖
lazyeval
,这可能很难解决。@Axeman谢谢。我将在
dplyr
issues页面上提出这个bug。如果你写下你对这个错误的分析,我会记下你的答案。我们可以更进一步:
as.lazy.character
calls
lazy(parse(text=x)[[1]],env)
;而
?parse
表示
文本:字符向量。要分析的文本。元素被视为文件的行
ie.parse需要一个有效的R表达式,在这种情况下禁止使用空格。
dots <- lazyeval::all_dots(.dots, ...)
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
      ^