在R中运行简单的“rename”功能时出现错误消息

piwo6bdm  于 2022-12-06  发布在  其他
关注(0)|答案(9)|浏览(486)

下面是我在网上找到的一个非常简单的 Dataframe 示例。在我的机器上运行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.
ecfdbz9o

ecfdbz9o1#

简短回答

迈克,你的命令是有效的,但“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()函数(因为dplyr包是最近加载的,所以它的优先级高于plyr)。
是的,改变你加载包的顺序也能解决问题,但这不是一个鼓励的解决方案--例如,一个和你分享代码的同事,不知道bug,可以很容易地改变顺序,事情又会发生变化;或者你未来的自我,忘记了“修复”,再次福尔斯同样的陷阱-经常发生在我身上: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日创建

xhv8bpkk

xhv8bpkk2#

现有列名和新列名必须使用不带引号的名称。另外,请注意,新名称显示在左手。
试试这个:

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

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

8cdiaqws3#

当我试图对分组数据集使用rename_all时,也遇到了这个错误。
例如:

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

将产生OP所述的错误。
要解决此问题,请使用ungroup()

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

kzipqqlq4#

我自己也是偶然发现这个问题的,所以我想我应该分享一个解决方案。
您的代码中有两个问题。第一个问题(导致错误的原因)是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)

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

brqmpdu1

brqmpdu15#

如果你用的是dplyr而不是plyr,语法就会略有不同。我遇到了这个麻烦,用以下方法解决了它:
df <- df %>% rename(new_name=old_name)
或者在您的情况下:

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

yqyhoc1h6#

即使这个问题是旧的,它已经得到了回答,我也面临着同样的问题。安装“重塑”包为我修复了这个问题。

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

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

rename(d, c(beta="two", gamma="three"))
  • 谢谢-谢谢
af7jpaap

af7jpaap7#

同样的问题,并尝试了许多早期的建议,但唯一有效的是重新启动R/RStudio。我应该更多地作为默认。

cxfofazt

cxfofazt8#

我在使用dplyr rename()函数时遇到了一个问题,该函数的格式如下

d %>% rename(two=beta)

并得到一个错误

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

我通过将代码更改为

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

也许这只是一个简单的包屏蔽问题。这不是对原始问题的直接回答,但希望它能帮助任何收到类似错误消息的人,因为他们寻找修复可能会导致他们找到这个线程(就像我一样)。

5lhxktic

5lhxktic9#

我遇到了这个问题,并解决了它使用:

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

相关问题