dplyr::rename和dplyr::rename_all的区别

10
我多次审核了“dplyr”文档,并指出“dplyr::rename_all”是“dplyr::rename”的“scoped”变体。有人可以解释一下这涉及到语法和功能方面的具体内容吗?为什么要使用一个而不是另一个?关于此问题,“dplyr”文档并不清楚。
2个回答

24
  • 使用rename_all对所有名称应用一个函数
  • 使用rename给出单独的替换名称

例如:

library(dplyr)
cars %>% rename_all(toupper) %>% head
#   SPEED DIST
# 1     4    2
# 2     4   10
# 3     7    4
# 4     7   22
# 5     8   16
# 6     9   10

cars %>% rename_all(substr, 3) %>% head
#   spe dis
# 1   4   2
# 2   4  10
# 3   7   4
# 4   7  22
# 5   8  16
# 6   9  10

cars %>% rename(speeeeeed = speed, distance = dist) %>% head
#   speeeeeed distance
# 1         4        2
# 2         4       10
# 3         7        4
# 4         7       22
# 5         8       16
# 6         9       10

10
除了已经提到过的情况,当你有一个完整的列名替换集合分配给一个现有变量时,rename_all非常有用。
当你尝试将该变量传递给rename_all时会遇到困难。直接将变量传递给第二个参数.funs是行不通的,无论是否使用dplyr帮助文件中提到的funs()包装器。变量名称不是函数或表达式,而是符号。
new_car_names <- c("a", "b")

# Won't work.
cars %>% rename_all( new_car_names ) %>% head
cars %>% rename_all( funs( new_car_names ) ) %>% head

以下是一些可以使用“使用funs()引用的单个表达式”的示例:
cars %>% rename_all( funs( c("a", "b")) ) %>% head

cars %>% rename_all( funs( c(new_car_names) ) ) %>% head

cars %>% rename_all( funs( ~new_car_names ) ) %>% head

cars %>% rename_all( funs( quo(new_car_names) ) ) %>% head

这是一个“quosure中的单个表达式”的示例。
cars %>% rename_all( quo( quo(new_car_names) ) ) %>% head

这里是一个“函数”的例子(它不使用其参数)。

cars %>% rename_all( function(.){new_car_names} ) %>% head

最后,举个"用字符串命名函数"的例子。
test_function <- function(.){new_car_names}

cars %>% rename_all( "test_function" ) %>% head

虽然这个问题与rename_at无关,但是这些示例可以提示可能的用法。请注意,对于rename_at的第二个参数.vars,它接受字符向量或位置编号来标识您想要重命名的现有列。

cars %>% rename_at( .vars = "speed", function(.){new_car_names[[1]]} )

cars %>% rename_at( .vars = 1, function(.){new_car_names[[1]]} )

cars %>% rename_at( .vars = c(1,2), function(.){new_car_names} )

2
在这些情况下,你大多会使用 cars %>% setNames(new_car_names),不是吗?cars %>% rename_all( funs( ~new_car_names )) 不起作用。也许你的意思是 cars %>% rename_all(~new_car_names) - moodymudskipper
这是我的习惯。我一直在使用重命名函数族(renamerename_allrename_atrename_if),因为它们可以应对各种情况,而且在代码中搜索“rename”可以找到它们。setNames也可以使用,但请查看rlang包中的set_names。它与setNames类似,但具有附加功能。 - SoFarther
关于 cars %>% rename_all(~new_car_names) 无法工作,我刚刚尝试了以下代码:new_car_names <- c("a", "b") cars %>% rename_all( funs( ~new_car_names ) ) %>% head ,它可以正常工作。这两行代码是否无法执行或者无法为您重命名? - SoFarther
@SoFarther 我确认new_car_names <- c("a", "b"); cars %>% rename_all( funs( ~new_car_names ) ) %>% head对我无效。 - SavedByJESUS

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