【问题标题】:Setting names intuitively with dplyr across() function使用 dplyr cross() 函数直观地设置名称
【发布时间】:2020-06-27 06:14:02
【问题描述】:

我想操作几个列来创建新列,其名称是正在操作的列名称的变体。

dplyr 1.0.0 的 cross() 函数似乎是完成这项工作的工具,但 .names 参数似乎功能有限。这是我想做的:

tmp <- iris %>% 
  mutate(across(starts_with('Sepal'), 
                ~ .x - Petal.Length, 
                .names = gsub('Sepal', '', "{col}")))

但是 gsub 函数不起作用。我可以通过以下方式解决这个问题:

tmp <- iris %>% 
  mutate(across(starts_with('Sepal'), 
                ~ .x - Petal.Length, 
                .names = "mod_{col}"))

names(tmp) <- gsub("mod_Sepal", "mod_", names(tmp))

但这需要更多代码并且更难跟踪。我在这里遗漏了什么吗?有没有更简单的方法来设置新的列名?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以在mutate 步骤之后使用rename_at

    library(dplyr)
    library(stringr)
    iris %>% 
      mutate(across(starts_with('Sepal'), 
                ~ .x - Petal.Length)) %>%      
      rename_at(vars(starts_with("Sepal")), ~ str_remove(., "Sepal"))
    

    根据?across

    .names - 对于单函数情况,默认值 (NULL) 等效于 "{col}"

    并且没有删除已经存在的列名的选项,但是,我们可以添加后缀或前缀

    【讨论】:

      【解决方案2】:

      您可以将函数传递给.names -

      library(dplyr)
      
      iris %>% 
        mutate(across(starts_with('Sepal'), ~ .x - Petal.Length, 
                      .names = "{gsub('Sepal.', '', {col}, fixed = TRUE)}")) 
      
      #  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Length Width
      #1          5.1         3.5          1.4         0.2  setosa    3.7   2.1
      #2          4.9         3.0          1.4         0.2  setosa    3.5   1.6
      #3          4.7         3.2          1.3         0.2  setosa    3.4   1.9
      #4          4.6         3.1          1.5         0.2  setosa    3.1   1.6
      #5          5.0         3.6          1.4         0.2  setosa    3.6   2.2
      #6          5.4         3.9          1.7         0.4  setosa    3.7   2.2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-18
        • 2020-09-21
        • 2020-07-06
        • 2022-10-14
        • 2018-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多