Накопление по дате - PullRequest
0 голосов
/ 03 июля 2019

Я хотел бы знать, сколько животных появится в определенный день. На этой диаграмме люди заранее регистрируют своих животных.

Например, в 7 дни впереди кто-то зарегистрировался для их 4 кошек, чтобы показать на 5/3/2019; в 6 дней вперед, еще 9 кошек зарегистрированы на 5/3/2019. Так что на 5/3/2019 появятся 7+6=13 кошек.

Когда days_ahead = 0, это просто означает, что кто-то зарегистрировался в день мероприятия. Например, 4 волки зарегистрировались для 5/1/2019 на 5/1/2019 (0 дней вперед), и в этот день будет 4 волков.

library(dplyr)
set.seed(0)

animal = c(rep('cat', 5), rep('dog', 6), rep('wolf', 3))
date = sample(seq(as.Date("2019/5/1"), as.Date('2019/5/10'), by='day'), 14, replace=TRUE)
days_ahead = sample(seq(0,14), 14, replace=FALSE)
number = sample.int(10, 14, replace=TRUE)

dt = data.frame(animal, date, days_ahead, number) %>% arrange(animal, date)

Ожидаемый результат должен иметь те же столбцы 1-3, что и в примере, но четвертый столбец должен быть суммированным числом по каждому date, накапливаясь в days_ahead.


Я добавил ожидаемый результат здесь. comments используются для объяснения столбца accumulated_number.

enter image description here

Я рассмотрел loop функцию, но не совсем уверен, как зациклить три переменные (cat, date и days_ahead). Любой совет приветствуется !!

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

accumulated_number несколько проще с cumsum(). Смотрите эту ссылку для вашего comments поля:

Кумулятивная вставка (объединение) значений, сгруппированных по другой переменной

dt%>%
  group_by(animal,date)%>%
  mutate(accumulated_number = cumsum(number)
         ,comments = Reduce(function(x1, x2) paste(x1, x2, sep = '+'), as.character(number), accumulate = T)
         )%>%
  ungroup()

Кроме того, мой набор данных немного отличается от вашего с тем же семенем. Тем не менее, это похоже на работу.

# A tibble: 14 x 6
   animal date       days_ahead number accumulated_number comments
   <fct>  <date>          <int>  <int>              <int> <chr>   
 1 cat    2019-05-03         10      9                  9 9       
 2 cat    2019-05-04          6      4                  4 4       
 3 cat    2019-05-06          8      5                  5 5       
 4 cat    2019-05-09          5      4                  4 4       
 5 cat    2019-05-10         13      6                  6 6       
 6 dog    2019-05-01          0      2                  2 2       
 7 dog    2019-05-03          3      5                  5 5       
 8 dog    2019-05-07          1      7                  7 7       
 9 dog    2019-05-07          9      8                 15 7+8     
10 dog    2019-05-09         12      2                  2 2       
11 dog    2019-05-10          7      9                  9 9       
12 wolf   2019-05-02         14      5                  5 5       
13 wolf   2019-05-03         11      8                  8 8       
14 wolf   2019-05-07          4      9                  9 9 
0 голосов
/ 03 июля 2019

Я не уверен, что понимаю ваш вопрос, это то, что вы хотите?

Я добавляю столбец "animals_arriving" и оставляю остаток dt

library(dplyr)
library(lubridate)
dt %>% 
  mutate(date_arrival = date + days(days_ahead)) %>%
  group_by(date = date_arrival) %>% 
  summarise(animals_arriving = n()) %>% 
  full_join(dt,by="date")
...