Dplyr 多个管道动态变量?

dea*_*pwr 2 r dplyr tidyeval

我经常这样做:

library(tidyverse)

iris %>% 
  group_by(Species) %>% 
  summarise(num_Species = n_distinct(Species)) %>% 
  mutate(perc_Species = 100 * num_Species / sum(num_Species))
Run Code Online (Sandbox Code Playgroud)

所以我想创建一个输出相同内容但具有动态命名的 num_ 和 perc_ 列的函数:

num_perc <- function(df, group_var, summary_var) {
  
}
Run Code Online (Sandbox Code Playgroud)

我发现这个资源很有用,但它没有直接解决如何以我想要的方式重用新创建的列名称。

cal*_*lst 6

您可以做的是使用as_label(enquo())您group_var来提取作为字符向量传递的变量来生成新列。您可以在您发送的链接文档中看到一个明显的示例,即6.1.3 。通过这种方式,我们可以动态地将num_and添加perc_到您的摘要变量中,并且只需要传入dfand 即可group_var即可。

\n
library(dplyr)\n\nnum_perc <- function(df, group_var) {\n  summary_lbl <- as_label(enquo(group_var))\n  num_lbl <- paste0("num_", summary_lbl)\n  perc_lbl <- paste0("perc_", summary_lbl)\n  \n  df %>%\n    group_by({{ group_var }}) %>%\n    summarize(!!num_lbl := n_distinct({{ group_var }})) %>%\n    mutate(!!perc_lbl := 100 * .data[[num_lbl]] / sum(.data[[num_lbl]]))\n}\n\nnum_perc(iris, Species)\n#> # A tibble: 3 \xc3\x97 3\n#>   Species    num_Species perc_Species\n#>   <fct>            <int>        <dbl>\n#> 1 setosa               1         33.3\n#> 2 versicolor           1         33.3\n#> 3 virginica            1         33.3\n
Run Code Online (Sandbox Code Playgroud)\n

在这种情况下,group_var和summary_var实际上有所不同,本质上是相同的解决方案。

\n
num_perc <- function(df, group_var, summary_var) {\n  summary_lbl <- as_label(enquo(summary_var))\n  num_lbl <- paste0("num_", summary_lbl)\n  perc_lbl <- paste0("perc_", summary_lbl)\n  \n  df %>%\n    group_by({{ group_var }}) %>%\n    summarize(!!num_lbl := n_distinct({{ summary_var }})) %>%\n    mutate(!!perc_lbl := 100 * .data[[num_lbl]] / sum(.data[[num_lbl]]))\n}\n\nnum_perc(iris, Species, Species)\n
Run Code Online (Sandbox Code Playgroud)\n