计算多列的摘要

时间:2021-06-08 04:29:01

标签: r

我正在尝试计算一组列的中位数,但它只计算一列。我在这里做错了什么......??

df <- data.frame(Name = c("ABC",    "DCA",  "GOL",NA,   "MNA",NA,   "VAN"),
                 Goal =c("published",   "pending",  "not designed",NA,  "pending",  "pending",  "not designed"),
                 Target_1 = c(3734, 2639,   2604,   NA, 2793,   2688,   2403),
                 Target_2 = c(3322, 2016,   2310,   NA, 3236,   3898,   2309),
                 Target_3 = c(3785, 2585,   3750,   NA, 2781,   3589,   2830))



df_summary <- df %>% select(contains("Target")) %>% summarise(
  q25 = round(quantile(.,  type=6, probs = seq(0, 1, 0.25), na.rm=TRUE)[2],digits = 0),
  Median = round(quantile(., type=6, probs = seq(0, 1, 0.25), na.rm=TRUE)[3],digits = 0),
  Mean = round( mean(., na.rm=TRUE),digits = 0),
  q75 = round(quantile(., type=6, probs = seq(0, 1, 0.25), na.rm=TRUE)[4],digits = 0),
  N = sum(!is.na(.)))

2 个答案:

答案 0 :(得分:1)

使用 across 将函数应用于多列。

library(dplyr)
library(tidyr)

df %>% 
  summarise(across(contains("Target"), list(
    q25 = ~round(quantile(.,  type=6, probs = 0.25, na.rm=TRUE),digits = 0),
    Median = ~round(quantile(., type=6, probs = 0.5, na.rm=TRUE),digits = 0),
    Mean = ~round( mean(., na.rm=TRUE),digits = 0),
    q75 = ~round(quantile(., type=6, probs = 0.75, na.rm=TRUE),digits = 0),
    N = ~sum(!is.na(.)))))

#  Target_1_q25 Target_1_Median Target_1_Mean Target_1_q75 Target_1_N Target_2_q25
#1         2554            2664          2810         3028          6         2236
#  Target_2_Median Target_2_Mean Target_2_q75 Target_2_N Target_3_q25 Target_3_Median
#1            2773          2848         3466          6         2732            3210
#  Target_3_Mean Target_3_q75 Target_3_N
#1          3220         3759          6

或者长格式是显示值的更好方式。

df %>%
  pivot_longer(cols = contains("Target")) %>%
  group_by(name) %>%
  summarise( q25 = round(quantile(value,  type=6, probs = 0.25, na.rm=TRUE),digits = 0),
             Median = round(quantile(value, type=6, probs = 0.5, na.rm=TRUE),digits = 0),
             Mean = round( mean(value, na.rm=TRUE),digits = 0),
             q75 = round(quantile(value, type=6, probs = 0.75, na.rm=TRUE),digits = 0),
             N = sum(!is.na(value)))

#  name       q25 Median  Mean   q75     N
#  <chr>    <dbl>  <dbl> <dbl> <dbl> <int>
#1 Target_1  2554   2664  2810  3028     6
#2 Target_2  2236   2773  2848  3466     6
#3 Target_3  2732   3210  3220  3759     6

答案 1 :(得分:1)

使用 map

df %>%
  select(contains('Target'))%>%
  map_dfr(~c(quantile(.x, type=6, probs = c(.25, .5,.75),  na.rm = TRUE),
              mean = mean(.x, na.rm = TRUE), 
              N = length(na.omit(.x))), .id = 'grp')
 grp      `25%` `50%` `75%`  mean     N
  <chr>    <dbl> <dbl> <dbl> <dbl> <dbl>
1 Target_1 2554. 2664. 3028. 2810.     6
2 Target_2 2236. 2773  3466  2848.     6
3 Target_3 2732  3210. 3759. 3220      6

你所做的一切似乎都是一个总结:

df %>%
  select(contains('Target'))%>%
  summary()

另一种可能是:

df %>%
  summarise(across(contains('Target'), 
      ~list(quantile(.x, type=6, probs = c(.25, .5,.75), na.rm = TRUE),
            mean(.x, na.rm = TRUE), 
            length(na.omit(.x))))
      )%>%
  unnest(everything())

 A tibble: 5 x 3
  Target_1 Target_2 Target_3
     <dbl>    <dbl>    <dbl>
1    2554.    2236.    2732 
2    2664.    2773     3210.
3    3028.    3466     3759.
4    2810.    2848.    3220 
5       6        6        6 

如果您要包括旋转:

df %>%
  pivot_longer(contains('Target')) %>%
  group_by(name) %>%
  summarise(a = list(quantile(value, type=6, probs = c(.25, .5,.75),  na.rm = TRUE)),
            mean = mean(value, na.rm = TRUE), N = length(na.omit(value)))%>%
  unnest_wider(a)

# A tibble: 3 x 6
  name     `25%` `50%` `75%`  mean     N
  <chr>    <dbl> <dbl> <dbl> <dbl> <int>
1 Target_1 2554. 2664. 3028. 2810.     6
2 Target_2 2236. 2773  3466  2848.     6
3 Target_3 2732  3210. 3759. 3220      6