Получение обратных данных о заболеваемости из совокупных данных? - PullRequest
1 голос
/ 01 мая 2020

У меня есть фрейм данных, для которого у меня есть данные даты и кумулятивный счет. Я пытаюсь сделать перестановку cumsum , чтобы получить ежедневные подсчеты , но также получает подсчеты по группам. Я пытаюсь go из кадра данных A в кадр данных B. Я использую R и tidyr.

Вот код:


df <- data.frame(cum_count = c(5, 14, 50, 5, 14, 50),
                 state = c("Alabama", "Alabama", "Alabama", "NY", "NY", "NY"),
                 Year = c(2012:2014, 2012:2014))

Dataframe A
  cum_count   state Year
1         5 Alabama 2012
2        14 Alabama 2013
3        50 Alabama 2014
4         5      NY 2012
5        14      NY 2013
6        50      NY 2014
Dataframe B
  cum_count   state Year
1         5 Alabama 2012
2         9 Alabama 2013
3        36 Alabama 2014
4         5      NY 2012
5         9      NY 2013
6        36      NY 2014

I пытался использовать функцию сравнения:

df <- df %>%group_by(state)%>%
      mutate(daily_count = diff(cum_count))

Но я получаю

Ошибка: столбец daily_count должен быть длиной 3 (количество строк) или один, а не 2

Дайте мне знать, что вы думаете.

Спасибо!

1 Ответ

1 голос
/ 01 мая 2020

diff возвращает length на единицу меньше, чем исходная длина, а mutate требует, чтобы выходной столбец имел такой же length, что и оригинал (или длина 1, которая может быть переработана). Мы можем добавить значение, возможно NA или first значение 'cum_count'

library(dplyr)
df %>%
  group_by(state)%>%
  mutate(daily_count = c(first(cum_count), diff(cum_count)))
# A tibble: 6 x 4
# Groups:   state [2]
#  cum_count state    Year daily_count
#      <dbl> <fct>   <int>       <dbl>
#1         5 Alabama  2012           5
#2        14 Alabama  2013           9
#3        50 Alabama  2014          36
#4         5 NY       2012           5
#5        14 NY       2013           9
#6        50 NY       2014          36

Или для этой цели использовать lag и вычесть из самого столбца

df %>%
    group_by(state)%>%
    mutate(daily_count = replace_na(cum_count - lag(cum_count), first(cum_count)))
...