web-dev-qa-db-ja.com

Rで単純な「名前変更」機能を実行するとエラーメッセージが表示される

以下は、インターネットで見つけた非常に単純なデータフレームの例です。私のマシンの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.
32
Mike

簡潔な答え

マイク、あなたのコマンドは有効ですが、「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"))
_

問題をよりよく理解するためのいくつかの特別な考え

1)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に作成

2)救助のための「衝突した」パッケージ

このようなエラーは比較的よくあるため、ここでは 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に作成

58
Valentin

既存の列名と新しい名前には、引用符で囲まれていない名前を使用する必要があります。また、新しい名前が左側に表示されることに注意してください。

これを試して:

rename(d, two = beta, three = gamma)

  alpha two three
1     1   4     7
2     2   5     8
3     3   6     9
19
Andrie

グループ化されたデータセットでrename_allを使用しようとしたときにも、このエラーが発生しました。

例えば:

as_tibble( mtcars ) %>% group_by(cyl) %>% rename_all(toupper) 

oPに記載されているエラーが生成されます。

解決するには、ungroup()を使用します

as_tibble( mtcars ) %>% group_by(cyl) %>%  ungroup() %>% rename_all(toupper) 
4
No More Hacks

Plyrの代わりにdplyrを使用している場合、文法はわずかに異なります。私はこの問題を抱えていて、それを使用して解決しました:

df <- df %>% rename(new_name=old_name)

またはあなたの場合:

d <- d %>% rename(two=beta,three=gamma)
2
Bernal

私はこの問題に自分でつまずいたので、解決策を共有すべきだと思いました。

コードには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)

ただし、列を事前に知っている場合は、最初の例を使用できます。

0
Chris Middleton

質問は古いものであり、回答されているにもかかわらず、私は同じ問題に直面しました。 「reshape」パッケージをインストールすると、問題が修正されました。

install.packages("reshape")
library(reshape)

これで、以下のコードは正常に動作するはずです。

rename(d, c(beta="two", gamma="three"))

ありがとう。

0
Samira Kumar