Р: Как рассчитать частоту двухдневной продолжительности из совокупных данных после извлечения максимального числа за тот же день? - PullRequest
1 голос
/ 10 февраля 2020

У меня есть накопленные данные, такие как:

df1 <- data.frame(code=c(1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,4,4,4,4,5,5,5,5), 
                 date=c("2020-01-01", "2020-01-01","2020-01-02","2020-01-03","2020-01-04","2020-01-01","2020-01-02","2020-01-03",
                        "2020-01-04","2020-01-01","2020-01-01","2020-01-02","2020-01-02","2020-01-03","2020-01-04","2020-01-01",
                        "2020-01-02","2020-01-04","2020-01-03","2020-01-01","2020-01-02","2020-01-03","2020-01-04"),
                 cumulative=c(2,3,3,4,4,4,4,6,6,7,8,10,13,14,16,1,2,3,5,1,2,3,5))

Отсюда я хочу извлечь максимальное совокупное число каждого кода и каждой даты, как;

df2 <- data.frame(code=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5), 
                  date=c("2020-01-01","2020-01-02","2020-01-03","2020-01-04","2020-01-01","2020-01-02","2020-01-03",
                         "2020-01-04","2020-01-01","2020-01-02","2020-01-03","2020-01-04","2020-01-01",
                         "2020-01-02","2020-01-03","2020-01-04","2020-01-01","2020-01-02","2020-01-03","2020-01-04"),
                  cumulative=c(3,3,4,4,4,4,6,6,8,13,14,16,1,2,3,5,1,2,3,5))

Теперь у меня есть кумулятивные числа для каждого кода каждого дня. Отсюда я хочу рассчитать заболеваемость продолжительностью 2 дня.

df3 <- data.frame(code=c(1,2,3,4,5),
                  incidence1=c(1,2,6,2,2),incidence2=c(1,2,3,3,3))

Заболеваемость1 означает разницу между 2020-01-01 и 2020-01-03, Заболеваемость2 означает разницу между 2020-01-02 и 2020-01-04

Что я хочу узнать это 1) Как извлечь максимальное число в течение того же дня 2) Как рассчитать разницу между 2 днями

Пожалуйста, научите меня, спасибо.

1 Ответ

1 голос
/ 10 февраля 2020

Вот один из способов сделать это, создав группы из каждой альтернативной строки и получив разницу значений cumulative между ними. Чтобы получить ожидаемый результат в том же формате, как показано, мы можем использовать pivot_wider из tidyr.

library(dplyr)
library(tidyr)

df2 %>%
  group_by(code) %>%
  group_by(gr = rep(seq(1, n()/2), 2), add = TRUE) %>%
  summarise(incidence = diff(cumulative)) %>%
  pivot_wider(names_from = gr, values_from = incidence, names_prefix = "incidence")

#  code incidence1 incidence2
#  <dbl>      <dbl>      <dbl>
#1     1          1          1
#2     2          2          2
#3     3          6          3
#4     4          2          3
#5     5          2          3
...