在运行R语言中简单的“rename”函数时出现错误信息。

46

以下是我在互联网上找到的一个非常简单的数据框示例。但是,在我的计算机上在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.

20
当我同时加载plyrdplyr并尝试使用rename()命令时,我会收到这个错误提示。 我通过使用plyr:: rename()来避免此问题。 - coip
9个回答

82

简短回答

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搜索函数/对象的顺序。

在下面的例子中,除了加载两个具有相同函数名称的包时会出现警告之外,您可以调用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包(v0.2.1)于2019-04-20创建

2) "conflicted" 包的应用

这种错误相对常见,因此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")

2019年04月20日由reprex包 (v0.2.1)创建


19

您需要对现有列名和新名称都使用未引用的名称。另外,注意新名称出现在左侧。

请尝试以下操作:

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

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

对于后来者而言,“未引用”的部分仅在您将新名称放置于“=”的左侧,旧名称放置于右侧时才为真,这与?rename中的帮助文档相反。 - Jason Goal
订单是我的问题。谢谢! - DHW

4
当我尝试在分组数据集上使用rename_all时,也遇到了这个错误。
例如:
as_tibble( mtcars ) %>% group_by(cyl) %>% rename_all(toupper) 

将会产生OP所述的错误。

为解决此问题,请使用ungroup()。

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

这似乎不是原帖作者的问题,但却是我的问题。谢谢。 - quartin
1
同样的错误在rename_at中也发生了,使用相同的修复方法。+1 - shayaa

4

我刚刚发现了这个问题,所以我想分享一种解决方法。

你的代码有两个问题。第一个问题导致了错误,即dplyr::rename要求参数作为变量参数传递,而不是作为单个列表传递。换句话说,应该是:

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)

但是如果您事先知道列名,您可以直接使用第一个示例。


2
如果你使用的是 dplyr 而不是 plyr,语法会略有不同。我曾经遇到这个问题,解决方法如下: df <- df %>% rename(new_name=old_name) 在你的情况下应该是这样的:
d <- d %>% rename(two=beta,three=gamma)

0

遇到了同样的问题,并尝试了之前很多建议,但唯一有效的方法是重新启动R/Rstudio。我应该将其作为默认操作。


0

尽管这个问题很旧并且已经有了答案,但我也遇到了同样的问题。安装“reshape”包解决了我的问题。

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

现在下面的代码应该可以正常工作。

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

谢谢。


0

我遇到了这个问题,解决方法如下:

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

0

我在以下格式中使用dplyr的rename()函数时遇到了问题

d %>% rename(two=beta)

然后出现了一个错误

Error in rename(d, two=beta) : 
  unused argument (two=beta)

我通过改变代码来修复它

d %>% dplyr::rename(two=beta)

也许这只是一个简单的包掩盖问题。这不是对原始问题的直接回答,但希望它能帮助任何收到类似错误消息的人,因为他们寻找解决方法的搜索可能会将他们引导到这个线程(就像我一样)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接