在 R 中运行简单的“重命名”函数时出现错误消息
Posted
技术标签:
【中文标题】在 R 中运行简单的“重命名”函数时出现错误消息【英文标题】:Error message when running simple 'rename' function in R 【发布时间】:2015-08-14 06:46:25 【问题描述】:下面是我在互联网上找到的一个非常简单的数据框示例。在我的机器上的 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
并尝试使用rename()
命令时收到此错误消息。我绕过了这个使用plyr::rename()
【参考方案1】:
您必须对现有列名和新名称使用不带引号的名称。另请注意,新名称显示在左侧。
试试这个:
rename(d, two = beta, three = gamma)
alpha two three
1 1 4 7
2 2 5 8
3 3 6 9
【讨论】:
对于后面的人来说,unquoted 部分只有在=
左边加上旧名,右边是旧名时才成立,这与?rename
中的帮助文档。
订单是我的问题。谢谢!【参考方案2】:
简答
迈克,你的命令是有效的,但对于“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 认为你想使用 dplyr
包中的 rename()
函数(它优先于 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
由reprex package (v0.2.1) 于 2019 年 4 月 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 package (v0.2.1) 于 2019 年 4 月 20 日创建
【讨论】:
【参考方案3】:当我尝试在分组数据集上使用 rename_all 时,我也遇到了这个错误。
例如:
as_tibble( mtcars ) %>% group_by(cyl) %>% rename_all(toupper)
将产生 OP 所述的错误。
要解决,请使用 ungroup()
as_tibble( mtcars ) %>% group_by(cyl) %>% ungroup() %>% rename_all(toupper)
【讨论】:
这看起来不像是 OP 的问题,但这是我的问题。谢谢。rename_at
出现相同的错误,但具有相同的修复。 +1【参考方案4】:
即使这个问题已经过时并且已经得到解答,我也遇到了同样的问题。安装“reshape”包为我解决了这个问题。
install.packages("reshape")
library(reshape)
现在下面的代码应该可以正常工作了。
rename(d, c(beta="two", gamma="three"))
谢谢。
【讨论】:
【参考方案5】:如果您使用 dplyr 而不是 plyr,则语法略有不同。我遇到了这个问题并使用以下方法解决了它:
df <- df %>% rename(new_name=old_name)
或者在你的情况下:
d <- d %>% rename(two=beta,three=gamma)
【讨论】:
【参考方案6】:我自己只是偶然发现了这个问题,所以我想我应该分享一个解决方案。
您的代码中有两个问题。导致错误的第一个问题是 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))
但是,另一个问题是您的重命名是向后的。键应该是新的列名,值是旧的列名。所以你想这样做:
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)
但同样,如果您提前知道列,则可以使用第一个示例。
【讨论】:
【参考方案7】:同样的问题并尝试了许多早期的建议,但唯一有效的是重新启动 R/Rstudio。我应该更多地默认这样做。
【讨论】:
以上是关于在 R 中运行简单的“重命名”函数时出现错误消息的主要内容,如果未能解决你的问题,请参考以下文章
Django 2.0.7 - 进行重命名字段迁移时出现语法错误