gpt4 book ai didi

r - dplyr::summarize_at – 按传递的变量顺序对列排序,然后按应用函数的顺序排序

转载 作者:行者123 更新时间:2023-12-04 10:50:58 30 4
gpt4 key购买 nike

问题
通过使用 dplyr::summarize_at() (或等价物),我想得到一个汇总表,其中的列首先按 排序。 (G) 使用的分组变量的顺序,然后按 (五) 传递并最后传递的变量顺序(女) 应用的功能顺序。默认顺序首先由 G 确定,然后由 F 确定,最后由 V 确定。
示例
编码:

library(purrr)
library(dplyr)

q025 <- partial(quantile, probs = 0.025, na.rm = TRUE)
q975 <- partial(quantile, probs = 0.975, na.rm = TRUE)

vars_to_summarize <- c("height", "mass")

my_summary <- starwars %>%
filter(skin_color %in% c("gold", "green")) %>%
group_by(skin_color) %>%
summarise_at(vars_to_summarize, funs(q025, mean, q975))
结果是:
my_summary
## A tibble: 2 x 7
## skin_color height_q025 mass_q025 height_mean mass_mean height_q975 mass_q975
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 gold 167.000 75.0 167 75 167.00 75.0
## 2 green 79.375 22.7 169 NA 204.75 110.4
所需的变量顺序应该是:
skin_color, height_q025, height_mean, height_q975, mass_q025, mass_mean, mass_q975
我想使用这样的(天真的简单)代码:
my_summary  %>% 
select(everything(), starts_with(vars_to_summarize))
但它不起作用。即使这段代码也不能像我预期的那样工作
(即使这不是我寻求的通用解决方案):
my_summary  %>% 
select(everything(),
starts_with(vars_to_summarize[1]),
starts_with(vars_to_summarize[2]))
最有可能 everything()应该始终是 select() 中的最后一个参数.
概括
说,我有:
  • 我传递给 group_by() 的 N 个分组变量(“gr_”) ,
  • 必须汇总的 L 变量(“var_”)和
  • 要应用的 M 个汇总函数(“fun_”)。

  • 通常,所需的变量顺序
    在汇总表中应遵循以下模式:
    gr_1, gr_2, ..., gr_N,   
    var_1_fun_1, var_1_fun_2, ..., var_1_fun_M,
    var_2_fun_1, var_2_fun_2, ..., var_2_fun_M,
    ...,
    var_L_fun_1, var_L_fun_2, ..., var_L_fun_M

    最佳答案

    我们可以使用 matchesgrep

    my_summary %>%
    select(grep(paste(vars_to_summarize, collapse="|"), names(.), invert = TRUE),
    matches(vars_to_summarize[1]),
    matches(vars_to_summarize[2]))
    # A tibble: 2 x 7
    # skin_color height_q025 height_mean height_q975 mass_q025 mass_mean mass_q975
    # <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #1 gold 167.000 167 167.00 75.0 75 75.0
    #2 green 79.375 169 204.75 22.7 NA 110.4

    如果有很多列,那么另一种选择是从 _ 中删除子字符串。在列名中, match使用 'vars_to_summarize' 和 orderselect
    my_summary %>% 
    select(order(match(sub("_.*", "", names(.)), vars_to_summarize, nomatch = 0)))
    # A tibble: 2 x 7
    # skin_color height_q025 height_mean height_q975 mass_q025 mass_mean mass_q975
    # <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #1 gold 167.000 167 167.00 75.0 75 75.0
    #2 green 79.375 169 204.75 22.7 NA 110.4

    关于r - dplyr::summarize_at – 按传递的变量顺序对列排序,然后按应用函数的顺序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45545586/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com