【问题标题】:dplyr: Renaming variables with rename_dplyr:使用 rename_ 重命名变量
【发布时间】:2017-01-29 12:52:33
【问题描述】:

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

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 提出。

【问题讨论】:

  • 您愿意接受非dplyr 的解决方案吗?该包不能很好地处理变量名中的空格。
  • @Hugh 我想我已经有了非dplyr 的解决方案,即直接在名称上运行gsub。我只想了解这里发生了什么。
  • 错误可以追溯到lazyeval::as.lazy('aa a')返回解析错误。由于dplyr 内部严重依赖lazyeval,这可能很难解决。
  • @Axeman 谢谢。我将在dplyr 问题页面上将此作为错误提出。如果您写出您对错误的分析,我会标记您的答案。

标签: r dplyr gsub


【解决方案1】:

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

这是导致此错误的原因。

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 表达式作为其文本参数:

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

这就是为什么rename_ 似乎不喜欢带有空格的字符向量并且我们得到“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 进行这个简单的重命名。

【讨论】:

  • 我们可以走得更远:as.lazy.character 调用 lazy_(parse(text = x)[[1]], env) ;和?parsetext: character vector. The text to parse. Elements are treated as if they were lines of a file 即。 parse 需要一个有效的 R 表达式,在这种情况下禁止空格。
猜你喜欢
  • 2021-10-22
  • 2017-06-10
  • 2018-07-04
  • 2018-09-13
  • 1970-01-01
  • 2015-08-03
  • 2019-05-10
  • 2016-07-30
  • 2016-10-02
相关资源
最近更新 更多