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

Difference between dplyr::rename and dplyr::rename_all

我已经多次查看 dplyr 的文档,它表明 dplyr::rename_alldplyr::rename 的 "scoped" 变体。有人可以解释这在语法和功能方面意味着什么吗?为什么使用一个而不是另一个? dplyr 的文档对此并不清楚。

  • 使用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

除了已经提到的情况外,当您将一整套列名替换分配给现有变量时,rename_all 会派上用场。

当您尝试将该变量传递给 rename_all 时,困难就来了。将变量直接传递给第二个参数 .funs 是行不通的,无论是否使用 dplyr 帮助文件中提到的 funs() 包装器。变量名不是函数或表达式。是一个符号。

.funs A single expression quoted with funs() or within a quosure, a string naming a function, or a function.

new_car_names <- c("a", "b")

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

这里有一些 "single expression quoted with 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

这是一个 "single expression within a quosure" 的例子。

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

这里有一个 "a function" 的例子(没有使用它的参数)。

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

最后是 "a string naming a function" 的例子。

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} )