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

时间:2017-08-07 11:14:16

标签: r sorting dplyr summarize

问题

通过使用dplyr::summarize_at()(或等效的),我想得到一个摘要表,其中列首先按(G)使用的分组变量顺序排序,然后按< strong>(V)传递的顺序,最后是(F)应用的函数顺序。默认顺序首先由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()
  1. N 分组变量(“gr_”),
  2. L 变量(“var_”)必须进行汇总和
  3. M 要应用的汇总函数(“fun _”)。
  4. 一般来说,所需的变量顺序 在摘要表中应遵循以下模式:

    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
    

1 个答案:

答案 0 :(得分:4)

我们可以使用fread()matches

grep

如果列数很多,那么另一个选项就是从列名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 中删除_中的子字符串,并使用&#39; vars_to_summarize&#39;和match

中的order
select