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

时间:2017-08-06 18:17:45

标签: r dplyr tidyverse

我已多次查看dplyr的文档,但它表明dplyr::rename_all是"范围" dplyr::rename的变体。有人能解释一下这对语法和功能有什么影响吗?为什么使用一个与另一个? dplyr的文档对此并不清楚。

2 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:7)

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

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

  

.funs用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

这里是“单次表达内的一个例子”。

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