Подтвердить что ты не робот

Сообщение об ошибке при запуске простой функции "переименовать" в 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.
4b9b3361

Ответ 1

Краткий ответ

Майк, твоя команда действительна, но для пакета "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 ищет функции/объекты.

В приведенном ниже примере, кроме предупреждений, которые вы получаете при загрузке двух пакетов с одинаковыми именами функций, вы можете вызвать search(), чтобы понять, что R будет сначала искать функции в ".GlobalEnv" (среде по умолчанию при запуске R), затем в "package: dplyr", а затем в "package: plyr" и так далее. Таким образом, вы получаете сообщение об ошибке, потому что R думает, что вы хотите использовать функцию rename() из пакета dplyr (который имеет приоритет над plyr, потому что загружен совсем недавно).

И да, верно, что изменение порядка загрузки пакетов также решает проблему, но это не является обнадеживающим решением - например, коллега, с которым вы делитесь кодом, не подозревая об ошибке, может легко изменить порядок и все снова встанет; или твоя будущая личность, забыв о "починке", снова попадает в ту же ловушку - часто случается со мной: 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

Created on 2019-04-20 by the reprex package (v0.2.1)

2) "конфликтный" пакет для спасения

Такие ошибки относительно распространены, поэтому конфликтующий пакет может быть очень удобен здесь. После загрузки вы можете ввести имя функции, которая дает вам ошибки, и вы получите некоторую полезную информацию, чтобы помочь вам отладить проблему - проверьте этот пример ниже:

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")

Created on 2019-04-20 by the reprex package (v0.2.1)

Ответ 2

Вы должны использовать неуказанные имена для имени существующего столбца, а также для нового имени. Также обратите внимание, что новое имя появляется с левой стороны.

Попробуйте следующее:

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

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

Ответ 3

У меня также была эта ошибка, когда я пытался использовать rename_all для сгруппированного набора данных.

например:

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

выдаст ошибку, как указано в OP.

Чтобы решить, используйте ungroup()

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

Ответ 4

Если вы используете dplyr вместо plyr, грамматика немного отличается. Я имел эту проблему и решил ее с помощью:

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

Или в вашем случае:

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

Ответ 5

Хотя вопрос старый и на него дан ответ, я столкнулся с той же проблемой. Установка пакета "reshape" исправила проблему для меня.

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

Теперь приведенный ниже код должен работать нормально.

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

Благодарю.

Ответ 6

Я просто наткнулся на этот вопрос сам, поэтому я решил поделиться решением.

В вашем коде есть две проблемы. Первая проблема, которая вызывает ошибку, заключается в том, что dplyr::rename требует, чтобы аргументы передавались как аргументы var, а не как один список. Другими словами, это должно быть:

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

Если вы хотите сделать это динамически, вы можете использовать do.call следующим образом:

renames <- c(beta = 'two', gamma = 'three')
do.call(dplyr::rename, c(list(d), renames))

Однако другая проблема заключается в том, что у вас есть переименования в обратном направлении. Ключом должно быть имя нового столбца, а значением - имя старого столбца. Итак, вы хотите сделать это вместо этого:

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)

Но опять же, если вы знаете столбцы заранее, вы можете просто использовать первый пример.