Как мне group_by, суммировать, а затем выбрать как мин, так и макс? - PullRequest
1 голос
/ 18 июня 2019
         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 demand_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 и demand_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 Ответ

1 голос
/ 18 июня 2019

Мы можем использовать 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"))
...