以下は、インターネットで見つけた非常に単純なデータフレームの例です。私のマシンのRStudioでこれを実行すると、エラーメッセージが表示されます。
エラー:名前を変更するすべての引数には名前を付ける必要があります。
rename
関数は単純なように見えますが、何らかの理由で機能せず、その理由がわかりません。
library("dplyr")
d <- data.frame(alpha=1:3, beta=4:6, gamma=7:9)
d
# alpha beta gamma
# 1 1 4 7
# 2 2 5 8
# 3 3 6 9
rename(d, c("beta"="two", "gamma"="three"))
#Error: All arguments to rename must be named.
マイク、あなたのコマンドは有効ですが、「plyr」パッケージ用です。同じスクリプトで「dplyr」をロードすると、言及したエラーが発生します。
したがって、代わりにこれを試してください:
_library("plyr")
d <- data.frame(alpha=1:3, beta=4:6, gamma=7:9)
d <- plyr::rename(d, c("beta"="two", "gamma"="three"))
_
search()
関数search()
を使用して、Rが関数/オブジェクトを検索する順序を見つけることができます。
以下の例では、同じ関数名を持つ2つのパッケージをロードするときに表示される警告に加えて、search()
を呼び出して、Rが最初に「.GlobalEnv」( R)を開始し、次に「package:dplyr」、「package:plyr」などのように開始します。したがって、Rはdplyr
パッケージのrename()
関数を使用したいと考えているため、エラーメッセージが表示されます(最近読み込まれたためplyr
よりも優先されます)。
そして、はい、あなたがパッケージをロードする順序を変更することも問題を解決することは事実ですが、それは奨励された解決策ではありません-例えば。バグを知らずにコードを共有している同僚は、簡単に順序を変更でき、物事は再びスナップします。または「修正」を忘れて、あなたの将来の自己は再び同じtrapに落ちます-私に頻繁に起こります:D
_library(plyr)
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:plyr':
#>
#> arrange, count, desc, failwith, id, mutate, rename, summarise,
#> summarize
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
search()
#> [1] ".GlobalEnv" "package:dplyr" "package:plyr"
#> [4] "package:stats" "package:graphics" "package:grDevices"
#> [7] "package:utils" "package:datasets" "package:methods"
#> [10] "Autoloads" "package:base"
d <- data.frame(alpha=1:3, beta=4:6, gamma=7:9)
rename(d, c("beta"="two", "gamma"="three"))
#> All arguments must be named
_
reprexパッケージ (v0.2.1)によって2019-04-20に作成
このようなエラーは比較的よくあるため、ここでは conflicted パッケージが非常に便利です。ロードされると、エラーを与える関数の名前を入力することができ、問題のデバッグに役立ついくつかの有用な情報が得られます-以下の例を確認してください:
_library(conflicted)
library(plyr)
library(dplyr)
rename
#> [conflicted] `rename` found in 2 packages.
#> Either pick the one you want with `::`
#> * dplyr::rename
#> * plyr::rename
#> Or declare a preference with `conflict_prefer()`
#> * conflict_prefer("rename", "dplyr")
#> * conflict_prefer("rename", "plyr")
_
reprexパッケージ (v0.2.1)によって2019-04-20に作成
既存の列名と新しい名前には、引用符で囲まれていない名前を使用する必要があります。また、新しい名前が左側に表示されることに注意してください。
これを試して:
rename(d, two = beta, three = gamma)
alpha two three
1 1 4 7
2 2 5 8
3 3 6 9
グループ化されたデータセットでrename_allを使用しようとしたときにも、このエラーが発生しました。
例えば:
as_tibble( mtcars ) %>% group_by(cyl) %>% rename_all(toupper)
oPに記載されているエラーが生成されます。
解決するには、ungroup()を使用します
as_tibble( mtcars ) %>% group_by(cyl) %>% ungroup() %>% rename_all(toupper)
Plyrの代わりにdplyrを使用している場合、文法はわずかに異なります。私はこの問題を抱えていて、それを使用して解決しました:
df <- df %>% rename(new_name=old_name)
またはあなたの場合:
d <- d %>% rename(two=beta,three=gamma)
私はこの問題に自分でつまずいたので、解決策を共有すべきだと思いました。
コードには2つの問題があります。エラーの原因となっている最初の問題は、dplyr::rename
では、引数を単一のリストとしてではなく、var argsとして渡す必要があります。つまり、次のようになります。
rename(d, beta = "two", gamma = "three")
それを動的に行いたい場合、次のようにdo.callを使用できます。
renames <- c(beta = 'two', gamma = 'three')
do.call(dplyr::rename, c(list(d), renames))
ただし、もう1つの問題は、名前の変更が後方にあることです。キーは新しい列名であり、値は古い列名です。したがって、代わりにこれを行いたい:
renames <- c(two = 'beta', three = 'gamma')
do.call(dplyr::rename, c(list(d), renames))
そして、rlangの!!!
演算子:
renames <- c(two = 'beta', three = 'gamma')
dplyr::rename(d, !!!renames)
ただし、列を事前に知っている場合は、最初の例を使用できます。
質問は古いものであり、回答されているにもかかわらず、私は同じ問題に直面しました。 「reshape」パッケージをインストールすると、問題が修正されました。
install.packages("reshape")
library(reshape)
これで、以下のコードは正常に動作するはずです。
rename(d, c(beta="two", gamma="three"))
ありがとう。