在R

时间:2015-05-31 21:19:50

标签: r rename dplyr

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

7 个答案:

答案 0 :(得分:54)

简短回答

迈克,你的命令是有效的,但对于&#34; plyr&#34;包。如果您加载&#34; dplyr&#34;在同一个脚本中,您将收到您提到的错误。

因此,请尝试这样做:

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将首先在&#34; .GlobalEnv&#34;中查找函数。 (启动R时的默认环境),然后在&#34; package:dplyr&#34;然后在&#34;包装:plyr&#34;等等。因此,您收到错误消息,因为R认为您要使用rename()包中的dplyr函数(优先于plyr,因为最近加载了该函数)。

是的,改变加载包的顺序也解决了问题,但这不是一个鼓励的解决方案 - 例如与您共享代码的同事,如果不知道该错误,可以轻松更改订单,然后再次进行操作;或者你未来的自我,忘记了&#34;修复&#34;,再次落入同一陷阱 - 经常发生在我身上: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创建于2019-04-20(v0.2.1)

2)&#34;冲突&#34;包救援

此类错误相对常见,因此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创建于2019-04-20(v0.2.1)

答案 1 :(得分:19)

您必须为现有列名称使用不带引号的名称以及新名称。另请注意,新名称显示在左侧。

试试这个:

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

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

答案 2 :(得分:4)

当我尝试在分组数据集上使用rename_all时,我也遇到了此错误。

例如:

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

将产生OP所述的错误。

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

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

答案 3 :(得分:3)

我本人只是偶然发现了这个问题,所以我认为我应该分享一个解决方案。

您的代码中有两个问题。引起错误的第一个问题是^.*\.project.*$要求将参数作为var args(而不是单个列表)传递。换句话说,应该是:

dplyr::rename

如果要动态执行此操作,可以按以下方式使用do.call:

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

但是,另一个问题是您的重命名是向后的。键应该是新的列名,值是旧的列名。因此,您可以改为这样做:

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

并使用rlang的renames <- c(two = 'beta', three = 'gamma') do.call(dplyr::rename, c(list(d), renames)) 运算符:

!!!

但是同样,如果您提前知道列,则可以使用第一个示例。

答案 4 :(得分:2)

如果使用dplyr而不是plyr,则语法略有不同。我遇到了麻烦,并使用以下方法解决了该问题:

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

或者您的情况:

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

答案 5 :(得分:0)

即使这个问题很旧并且已经被回答,我也面临着同样的问题。安装“重塑”软件包对我来说解决了这个问题。

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

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

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

谢谢。

答案 6 :(得分:0)

相同的问题并尝试了许多先前的建议,但唯一有效的方法是重新启动R / Rstudio。我应该默认执行更多操作。