web-dev-qa-db-ja.com

dplyr rename-エラー: `new_name` = old_nameは数式ではなく記号または文字列でなければなりません

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'))
_
19

@aosmithがコメントしたように、これはrlangパッケージの開発バージョン(GitHubから)とリリースされたバージョンのdplyr(CRANから)を使用した結果です。完全な議論はここにあります: https://github.com/tidyverse/dplyr/issues/3252

どちらのパッケージもCRANまたはGitHubからのものである必要があります。ミスマッチが問題です。これを修正するには、devtools::install_github("tidyverse/dplyr")を使用してdplyrをdevバージョンに更新するか、rlangインストールを現在のCRANバージョンに戻します。

16
Sam Firke

私も同じ問題を抱えていました。念のためにすべてのパッケージを更新した後、機能します(下記のsessionInfo()を参照)。

修正

renameselectに切り替えます(何らかの理由で機能していました)

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 stratよりも簡単かもしれませんし、更新しても修正されない場合は。

> 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       
3
Jesse Tweedle