dplyr::rename 和 dplyr::rename_all 之间的区别
Difference between dplyr::rename and dplyr::rename_all
我已经多次查看 dplyr
的文档,它表明 dplyr::rename_all
是 dplyr::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} )
我已经多次查看 dplyr
的文档,它表明 dplyr::rename_all
是 dplyr::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} )