如何分组,汇总并选择最小和最大?

时间:2019-06-18 20:02:38

标签: r dplyr tidyverse

         Fx       claim_x
1      0.00       0
2      0.05       0
3      0.06       0
4      0.10       0
5      0.30       0
6      0.35     100
7      0.50     350
8      0.60     350
9      0.70     850
10     0.79    2350
11     0.90    4850
12     1.00    4850

以上是数据框。如果我想group_by Claim_x并选择Fx的最小值,我可以这样做:

min <- df %>% dplyr::group_by(claim_x) %>% dplyr::summarise(Fx=min(Fx))

如果我想要最大,我可以这样做:

max <- points %>% dplyr::group_by(claim_x) %>% dplyr::summarise(Fx=max(Fx))

问题是,如何在同一列中同时选择最小值和最大值?因此,输出应具有与输入相同的结构,即仅包含Fx和Claim_x列的数据帧。

输出应为:

# A tibble: 9 x 2
  claim_x    Fx
    <dbl> <dbl>
1       0  0   
2       0  0.3 
3     100  0.35
4     350  0.5 
5     350  0.6 
6     850  0.7 
7    2350  0.79
8    4850  0.9 
9    4850  1  

1 个答案:

答案 0 :(得分:1)

我们可以使用range并将其作为list列,然后再输入unnest

df %>%
  group_by(claim_x) %>%
  summarise(Fx = list(range(Fx))) %>%
  unnest %>%
  distinct
# A tibble: 9 x 2
#  claim_x    Fx
#    <int> <dbl>
#1       0  0   
#2       0  0.3 
#3     100  0.35
#4     350  0.5 
#5     350  0.6 
#6     850  0.7 
#7    2350  0.79
#8    4850  0.9 
#9    4850  1   

或使用data.table

library(data.table)
unique(setDT(df)[, .(Fx = range(Fx)), by = claim_x])

数据

df <- structure(list(Fx = c(0, 0.05, 0.06, 0.1, 0.3, 0.35, 0.5, 0.6, 
0.7, 0.79, 0.9, 1), claim_x = c(0L, 0L, 0L, 0L, 0L, 100L, 350L, 
350L, 850L, 2350L, 4850L, 4850L)), class = "data.frame", 
row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))