【问题标题】:Difference between dplyr::rename and dplyr::rename_alldplyr::rename 和 dplyr::rename_all 之间的区别
【发布时间】:2018-01-14 01:35:09
【问题描述】:

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

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:
    • 使用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
    

    【讨论】:

      【解决方案2】:

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

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

      .funs 用 funs() 或在 quosure 中引用的单个表达式,a 字符串命名函数或函数。

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

      【讨论】:

      • 不过,在这些情况下,您通常会使用cars %&gt;% setNames(new_car_names),不是吗? cars %&gt;% rename_all( funs( ~new_car_names )) 不起作用。也许你的意思是cars %&gt;% rename_all(~new_car_names)
      • 我的习惯。我一直在使用重命名系列(renamerename_allrename_atrename_if)给定家庭地址的范围,并且搜索“重命名”会在代码中找到所有内容。 setNames 有效,但请从包 rlang 中查看 set_names。它的工作方式类似于 setNames,但增加了一些功能。
      • 至于cars %&gt;% rename_all(~new_car_names) 不起作用,我刚刚尝试过:new_car_names &lt;- c("a", "b") cars %&gt;% rename_all( funs( ~new_car_names ) ) %&gt;% head 并且它起作用了。这两行是无法执行还是无法为您重命名?
      • @SoFarther 我确认new_car_names &lt;- c("a", "b"); cars %&gt;% rename_all( funs( ~new_car_names ) ) %&gt;% head 不适合我。
      猜你喜欢
      • 2021-10-22
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 2017-02-14
      相关资源
      最近更新 更多