下面是我在互联网上找到的一个非常简单的数据框示例。在我的机器上的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.
答案 0 :(得分:54)
因此,请尝试这样做:
library("plyr")
d <- data.frame(alpha=1:3, beta=4:6, gamma=7:9)
d <- plyr::rename(d, c("beta"="two", "gamma"="three"))
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)
此类错误相对常见,因此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。我应该默认执行更多操作。