dplyr 重命名 - 错误:`new_name` = old_name 必须是符号或字符串,而不是公式

Posted

技术标签:

【中文标题】dplyr 重命名 - 错误:`new_name` = old_name 必须是符号或字符串,而不是公式【英文标题】:dplyr rename - Error: `new_name` = old_name must be a symbol or a string, not formula 【发布时间】:2018-05-25 03:07:11 【问题描述】:

我正在尝试使用 dplyr::rename() 重命名列,而 R 正在返回此错误,我无法在线找到该错误。

Error: `new_name` = old_name must be a symbol or a string, not formula

具有 2 列数据框的可重现示例:

library(dplyr)
df <- data.frame(old_name = seq(1:10), x = seq(1:10))
df %>% dplyr::rename(new_name = old_name)

会话信息:

> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-apple-darwin17.2.0 (64-bit)
Running under: macOS High Sierra 10.13.1

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] dplyr_0.7.4

loaded via a namespace (and not attached):
 [1] compiler_3.4.3   magrittr_1.5     assertthat_0.2.0 R6_2.2.2
 [5] bindrcpp_0.2     glue_1.2.0       tibble_1.3.4     Rcpp_0.12.14.3
 [9] pkgconfig_2.0.1  rlang_0.1.4.9000 bindr_0.1
>

我希望这个新的简单数据框将第一列重命名为new_name。这也不适用于rename_()

当前的 R 版本是 3.4.3,dplyr 版本是 0.7.4。 我无法在 R 版本 3.3.3 上复制它,但能够在 R 版本 3.4.0 上复制它。这是在完全干净的 R 会话上测试的。

我目前的解决方案是用plyr::rename 重写我的部分代码,因为这仍然有效,但这并不理想,因为它需要我重写很多代码。plyr() 的工作示例:

library(plyr)
df <- data.frame(old_name = seq(1:10), x = seq(1:10))
df %>% plyr::rename(replace = c('old_name' = 'new_name'))

【问题讨论】:

可能与在dplyr'new_name' 中使用new_nameold_name 以及在plyr 中使用'old_name''old_name'(作为文本)有关。您能否也发布不适用于dplyrrename_() 版本?当它抛出该错误时,您只运行new_nameold_name 会得到什么? 如果您再次收到错误,请在看到错误弹出后立即运行sessionInfo()并在此处发布输出。 rename_() 版本:df %&gt;% dplyr::rename_('new_name' = 'old_name') 安装rlang的开发版后才能重现错误。在 R 3.4.2 上使用 CRAN 版本的 rlang 可以找到工作。 【参考方案1】:

正如@aosmith 评论的那样,这是将 rlang 包的开发版本(来自 GitHub)与 dplyr 的发布版本(来自 CRAN)一起使用的结果。完整的讨论在这里:https://github.com/tidyverse/dplyr/issues/3252

两个包都应该来自 CRAN 或两者都来自 GitHub;不匹配是问题所在。要解决此问题,您可以使用devtools::install_github("tidyverse/dplyr") 将您的 dplyr 更新到开发版本,或者将您的 rlang 安装恢复到当前的 CRAN 版本。

【讨论】:

FWIW 我通过一次更新所有tidyverse 包以及magrittrrlang 解决了这个问题。【参考方案2】:

我遇到了同样的问题。更新所有软件包以防万一后,它可以工作(请参阅下面的sessionInfo()

修复

rename 切换为select(由于某种原因可以正常工作)

df <- data.frame(old_name = seq(1:10), x = seq(1:10))
## df %>% dplyr::rename(new_name = old_name) # error
df %>% dplyr::select(new_name = old_name, everything())

这可能比plyr 策略更容易,如果更新不能解决它。

> sessionInfo()
R version 3.4.0 (2017-04-21)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS  10.13.2

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

locale:
[1] en_CA.UTF-8/en_CA.UTF-8/en_CA.UTF-8/C/en_CA.UTF-8/en_CA.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] rlang_0.1.6 dplyr_0.7.4

loaded via a namespace (and not attached):
 [1] compiler_3.4.0   magrittr_1.5     assertthat_0.2.0 R6_2.2.2        
 [5] tools_3.4.0      bindrcpp_0.2     glue_1.2.0       tibble_1.3.4    
 [9] yaml_2.1.16      Rcpp_0.12.14     pkgconfig_2.0.1  bindr_0.1       

【讨论】:

以上是关于dplyr 重命名 - 错误:`new_name` = old_name 必须是符号或字符串,而不是公式的主要内容,如果未能解决你的问题,请参考以下文章

dplyr 重命名“找不到对象”[关闭]

重命名 dplyr 中的列时的整洁评估

使用 dplyr 重命名未命名的变量

R dplyr:: 使用字符串变量重命名和选择

R语言dplyr包select函数rename函数dataframe变量抽取及重命名实战

Dplyr 使用字符串变量作为表达式重命名