在 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.

【问题讨论】:

当我同时加载了plyrdplyr 并尝试使用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 &lt;- df %&gt;% 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 - 进行重命名字段迁移时出现语法错误

重命名和重新创建文件时出现奇怪的时间戳重复

python重命名多个文件

为大型 hdf5 文件重命名组中的所有 HDF5 数据集时出现问题

npm 错误!错误:EPERM:不允许操作,重命名

重命名时,Javascript在赋值表达式的左侧无效[重复]