给定具有重复列名的 tibble 或 data.frame ,我想使用dplyr::rename
or dplyr::rename_with
:
(a)用序列数字后缀('a_1'
,'a_2'
等)区分重复的名称,或者
(b)完全重命名每一列。
有:
library(tidyverse)
d <- tibble(a = 1:3, a = letters[1:3], .name_repair = "minimal")
d
# A tibble: 3 x 2
a a
<int> <chr>
1 1 a
2 2 b
3 3 c
想:
tibble(a_1 = 1:3, a_2 = letters[1:3])
# A tibble: 3 x 2
a_1 a_2 # or even just: x, y
<int> <chr>
1 1 a
2 2 b
3 3 c
期望rename
/rename_with
可以执行此操作似乎是合理的,尤其是因为colnames(d) <- c("a_1", "a_2")
看起来很明显且不复杂。
但是到目前为止,我尝试过的三种方法都出现了不同的错误和/或意外行为:
1.使用rename()
,一列重命名,另一列不重命名:
d %>% rename(x = "a", y = "a")
# A tibble: 3 x 2
y a
<int> <chr>
1 1 a
2 2 b
3 3 c
2.使用rename_with()
,其中我使用函数添加数字后缀,我收到此错误:
d %>% rename_with(~paste(.x, 1:2, sep = "_"))
Error: Names must be unique.
x These names are duplicated:
* "a" at locations 1 and 2.
请注意,rename_with
当数据没有重复的列名时,这种使用按预期工作:
no_dupe <- tibble(a = 1:3, b = letters[1:3])
no_dupe %>% rename_with(~paste(.x, 1:2, sep = "_"))
# A tibble: 3 x 2
a_1 b_2
<int> <chr>
1 1 a
2 2 b
3 3 c
3.使用旧的rename_all()
,我得到一个不同的错误:
d %>% rename_all(paste0, 1:2)
Error: Can't rename duplicate variables to `{name}`.
rename
我在GitHub 问题中找到了关于处理重复项的讨论,tidyselect
但那是关于如果用户使用创建重复的列名rename()
该怎么办,而不是如果他们试图取消重复该怎么办。
我是否缺少语法,或者该dplyr::rename
系列没有设置为摄取重复的列名?
(我还想更好地理解为什么rename
在上面的示例中只重命名一列,但这不太实用,只是我很好奇。)
提前致谢。