Подсчитайте дни, пока сумма случаев не станет минимум 5 - R dyplyr solution - PullRequest
1 голос
/ 08 мая 2020

У меня есть набор данных с днями и случаями в день (например, болезнь, произведенные вирусы, ...)

Теперь я хочу подсчитать, как долго это длится, пока заранее определенное количество не будет сообщено / произведено.

Вот простой пример: у меня десять дней, в день в «делах» указано, сколько случаев было зарегистрировано в этот день.

Цель - получить столбец, как долго он длится на каждый день, пока не будет зарегистрировано (минимум) 5 случаев.

Мои данные:

dates<-c("10.03.2020","11.03.2020","12.03.2020","13.03.2020","14.03.2020",
         "15.03.2020","16.03.2020","17.03.2020","18.03.2020","19.03.2020")
cases<-c(0,1,2,2,6,2,2,1,5,1)
dftest<-data.frame(dates,cases)

        dates cases
1  10.03.2020     0
2  11.03.2020     1
3  12.03.2020     2
4  13.03.2020     2
5  14.03.2020     6
6  15.03.2020     2
7  16.03.2020     2
8  17.03.2020     1
9  18.03.2020     5
10 19.03.2020     1

И мой ожидаемый Результат. (Столбец days5cases также может быть числовым c):

        dates cases days5cases
1  10.03.2020     0      4days
2  11.03.2020     1      3days
3  12.03.2020     2      3days
4  13.03.2020     2      2days
5  14.03.2020     6       1day
6  15.03.2020     2      3days
7  16.03.2020     2      3days
8  17.03.2020     1      2days
9  18.03.2020     5       1day
10 19.03.2020     1       <NA>

EDIT:

Некоторые примеры для вычисления days5cases

  • 10.03. 2020 4 дня, потому что: 5 достигается на 13.03.2020 (0 + 1 + 2 + 2 = 5)
  • 11.03.2020 3 дня, потому что: 5 достигается на 13.03.2020 (1 + 2 + 2 = 5)
  • 12.03.2020 3 дня, потому что: 5 достигается 14.03.2020 (2 + 2 + 6 = 10> 5)
  • 13.03.2020 2 дня, потому что: 5 достигается 14.03.2020 ( 2 + 6 = 8> 5)
  • 14.03.2020 1 день, потому что: 5 достигается в 14.03.2020 (6> 5)
  • и так далее ...

Мой вопрос:

Как я могу суммировать столбец «дела», пока не будет достигнуто 5 случаев? Начало расчета - каждый день в датах.

Спасибо за любую идею по решению этой проблемы ....

Я пробовал из пакета runner sum_run, но здесь он только возможно получить сумму на ближайшие 5 дней.

Simmilary rollapply из пакета zoo.

Будь здоров!

1 Ответ

4 голосов
/ 08 мая 2020
• 1000
sapply(seq_len(nrow(dftest)), function(i) 
       which(cumsum(dftest$cases[i:nrow(dftest)]) >= 5)[1])

#[1]  4  3  3  2  1  3  3  2  1 NA

Для этого в tidyverse мы можем сделать:

library(dplyr)
library(purrr)
dftest %>%
   mutate(days5cases = map_dbl(row_number(), 
                           ~which(cumsum(cases[.x:n()]) >= 5)[1]))


#        dates cases days5cases
#1  10.03.2020     0          4
#2  11.03.2020     1          3
#3  12.03.2020     2          3
#4  13.03.2020     2          2
#5  14.03.2020     6          1
#6  15.03.2020     2          3
#7  16.03.2020     2          3
#8  17.03.2020     1          2
#9  18.03.2020     5          1
#10 19.03.2020     1         NA
...