我经常这样做:
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)
我发现这个资源很有用,但它没有直接解决如何以我想要的方式重用新创建的列名称。
您可以做的是使用as_label(enquo())您group_var来提取作为字符向量传递的变量来生成新列。您可以在您发送的链接文档中看到一个明显的示例,即6.1.3 。通过这种方式,我们可以动态地将num_and添加perc_到您的摘要变量中,并且只需要传入dfand 即可group_var即可。
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\nRun Code Online (Sandbox Code Playgroud)\n在这种情况下,group_var和summary_var实际上有所不同,本质上是相同的解决方案。
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)\nRun Code Online (Sandbox Code Playgroud)\n