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_name
和old_name
以及在plyr
中使用'old_name'
和'old_name'
(作为文本)有关。您能否也发布不适用于dplyr
的rename_()
版本?当它抛出该错误时,您只运行new_name
和old_name
会得到什么?
如果您再次收到错误,请在看到错误弹出后立即运行sessionInfo()
并在此处发布输出。
rename_()
版本:df %>% 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
包以及magrittr
和rlang
解决了这个问题。【参考方案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 必须是符号或字符串,而不是公式的主要内容,如果未能解决你的问题,请参考以下文章