Вставить новую строку в данные group_by в R dplyr в зависимости от условия - PullRequest
0 голосов
/ 27 октября 2018

Вот пример набора данных:

example = data.frame(
          bucket = c(0,0,0,0,0,1,1,1,1,1),
          bucket2 = c(0,1,2,3,4,0,1,2,3,4),
          rate = c(0.95,0.02,0.01,0.005,0,0.9,0.05,0.02,0.01,0))

И мне нужно, чтобы сумма ставки по сегменту была равна 1. В настоящее время она не равна 1.

example %>% group_by(bucket) %>% summarise(sum(rate))

Следовательно, мне нужен способ вставить новую строку с тарифом, чтобы сумма группировок тарифов по сегменту всегда была равна 1. Для этого примера мне нужно было бы вставить 2 новые строки, как показано ниже:

new_rows = data.frame(bucket = c(0,1), 
                      bucket2 = c('To make 0','To make 0'),
                      rate = c(0.015,0.02))

Реальный набор данных намного больше с большим количеством групп, но проблема все еще в том, как мне создать новую строку на основе моих условий, используя dplyr или другие пакеты? Буду признателен за любую оказанную помощь.

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Вы почти достигли того, что хотите.

new_rows <- example %>%
            group_by(bucket) %>%
            summarise(rate = 1 - sum(rate))

new_rows

#   bucket  rate
#    <dbl> <dbl>
# 1      0 0.015
# 2      1 0.02

bind_rows(example, new_rows)

#    bucket bucket2  rate
# 1       0       0 0.950
# 2       0       1 0.020
# 3       0       2 0.010
# 4       0       3 0.005
# 5       0       4 0.000
# 6       1       0 0.900
# 7       1       1 0.050
# 8       1       2 0.020
# 9       1       3 0.010
# 10      1       4 0.000
# 11      0      NA 0.015
# 12      1      NA 0.020
0 голосов
/ 27 октября 2018

Обычно для добавления строк требуется bind_rows. Чтобы сделать что-то для каждой группы (кроме обычных dplyr глаголов, хотя особенно не bind_rows), требуется блок do. Я предполагаю, что вам нужно для столбцов, но вы можете адаптировать предпосылку к чему-либо еще.

example2 <- example %>%
  group_by(bucket) %>%
  do(bind_rows(., data_frame(bucket = .$bucket[1], bucket2 = max(.$bucket2)+1, rate = 1-sum(.$rate))))
example2
# # A tibble: 12 x 3
# # Groups:   bucket [2]
#    bucket bucket2  rate
#     <dbl>   <dbl> <dbl>
#  1      0       0 0.95 
#  2      0       1 0.02 
#  3      0       2 0.01 
#  4      0       3 0.005
#  5      0       4 0    
#  6      0       5 0.015
#  7      1       0 0.9  
#  8      1       1 0.05 
#  9      1       2 0.02 
# 10      1       3 0.01 
# 11      1       4 0    
# 12      1       5 0.02 
example2 %>% group_by(bucket) %>% summarise(sum(rate))
# # A tibble: 2 x 2
#   bucket `sum(rate)`
#    <dbl>       <dbl>
# 1      0           1
# 2      1           1

Если вычисления для каждой группы более сложны, следует понимать, что более подробный вариант строки выглядит примерно так:

  ... %>%
  do({
    x <- .
    # more calcs feasible here, it's just an R block
    data_frame(
      bucket  = x$bucket[1],
      bucket2 = max(x$bucket2) + 1,
      rate    = 1 - sum(x$rate)
    )
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...