代码之家  ›  专栏  ›  技术社区  ›  Marta Karas

将dplyr summarise()与cross()结合使用并使用基于胶水的格式,不会产生预期的列名

  •  0
  • Marta Karas  · 技术社区  · 5 年前

    .names 争论 across() tibble 对象的列名包含有关所使用的摘要函数的信息。

    我试过了

    library(tidyverse)
    library(palmerpenguins)
    
    penguins_stats <- penguins %>% 
      dplyr::group_by(species) %>% 
      dplyr::summarise(across(.cols = ends_with("mm"), 
                              .fns = list(~mean(.x, na.rm = TRUE), 
                                          ~sd(.x, na.rm = TRUE)),
                              .names = "{.col}_{.fn}"))
    

    但是生成的输出具有列名 _1 _2 _mean _sd 正如我所料。

    names(penguins_stats)
    # [1] "species"             "bill_length_mm_1"   
    # [3] "bill_length_mm_2"    "bill_depth_mm_1"    
    # [5] "bill_depth_mm_2"     "flipper_length_mm_1"
    # [7] "flipper_length_mm_2"
    

    会话信息:

    sessionInfo()
    # R version 4.0.3 (2020-10-10)
    # Platform: x86_64-apple-darwin17.0 (64-bit)
    # Running under: macOS Catalina 10.15.7
    # 
    # Matrix products: default
    # BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
    # LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
    # 
    # locale:
    # [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
    # 
    # attached base packages:
    # [1] stats     graphics  grDevices utils     datasets  methods  
    # [7] base     
    # 
    # other attached packages:
    # [1] palmerpenguins_0.1.0 forcats_0.5.0       
    # [3] stringr_1.4.0        dplyr_1.0.2         
    # [5] purrr_0.3.4          readr_1.4.0         
    # [7] tidyr_1.1.2          tibble_3.0.4        
    # [9] ggplot2_3.3.2        tidyverse_1.3.0 
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Ronak Shah    5 年前

    您需要将命名参数传递给 .fns 使用 {.fn} 在里面 .names :

    library(dplyr)
    penguins_stats <- penguins %>% 
      dplyr::group_by(species) %>% 
      dplyr::summarise(across(.cols = ends_with("mm"), 
                              .fns = list(mean = ~mean(.x, na.rm = TRUE), 
                                          sd = ~sd(.x, na.rm = TRUE)),
                              .names = "{.col}_{.fn}"))
    
    names(penguins_stats)
    #[1] "species"                "bill_length_mm_mean"    "bill_length_mm_sd"     
    #[4] "bill_depth_mm_mean"     "bill_depth_mm_sd"       "flipper_length_mm_mean"
    #[7] "flipper_length_mm_sd"  
    

    但是,如果传递一个命名参数,则不需要

    penguins_stats <- penguins %>% 
      dplyr::group_by(species) %>% 
      dplyr::summarise(across(.cols = ends_with("mm"), 
                              .fns = list(mean = ~mean(.x, na.rm = TRUE), 
                                          sd = ~sd(.x, na.rm = TRUE))))
    names(penguins_stats)
    
    #[1] "species"                "bill_length_mm_mean"    "bill_length_mm_sd"     
    #[4] "bill_depth_mm_mean"     "bill_depth_mm_sd"       "flipper_length_mm_mean"
    #[7] "flipper_length_mm_sd"