Используйте dplyr, чтобы суммировать, но сохранить дату строки группы - PullRequest
0 голосов
/ 30 января 2020

У меня есть кадр данных, подобный следующему:

          Date Flare Painmed_Use
1   2015-12-01     0           0
2   2015-12-02     0           0
3   2015-12-03     0           0
4   2015-12-04     0           0
5   2015-12-05     0           0
6   2015-12-06     0           1
7   2015-12-07     1           4
8   2015-12-08     1           3
9   2015-12-09     1           1
10  2015-12-10     1           0
11  2015-12-11     0           0
12  2015-12-12     0           0
13  2015-12-13     1           2
14  2015-12-14     1           3
15  2015-12-15     1           1
16  2015-12-16     0           0

Я пытаюсь найти длину каждой вспышки, а также общее использование медикаментов во время каждой вспышки, используя dplyr. Мое текущее решение (вдохновленное Использовать rle для группировки по прогонам при использовании dplyr ),

df %>% 
    group_by(yy = {yy = rle(Flare); rep(seq_along(yy$lengths), yy$lengths)}, Flare) %>%
    summarize(Painmed_UseCum = sum(Painmed_Use),FlareLength = n())

дает следующий вывод:

     yy Flare Painmed_UseCum FlareLength
   <int> <int>          <dbl>       <int>
 1     1     0              1           6
 2     2     1              8           4
 3     3     0              0           2
 4     4     1              6           3
 5     5     0              0           1

Это почти точно Что мне нужно. Однако я не могу понять, как сохранить другие столбцы, критическим из которых является дата, соответствующая последнему ряду конкретной вспышки. Итак, вывод, который я ищу, такой же, как и выше, но с добавлением дат, например:

           Date      yy Flare Painmed_UseCum FlareLength
                  <int> <int>          <dbl>       <int>
 1   2015-12-06       1     0              1           6
 2   2015-12-10       2     1              8           4
 3   2015-12-12       3     0              0           2
 4   2015-12-15       4     1              6           3
 5   2015-12-16       5     0              0           1

Примечание: в некотором смысле это продолжение моего предыдущего вопроса ( R-код для получения максимального количества данных временных рядов по группам ), но моя попытка упростить этот вопрос, хотя и, возможно, полезная для других, закончилась необходимостью этого дополнительного вопроса.

1 Ответ

1 голос
/ 30 января 2020

Вы можете включить дату в summarise

library(dplyr)

df %>% 
  group_by(yy = {yy = rle(Flare); rep(seq_along(yy$lengths),yy$lengths)}) %>%
  summarize(Painmed_UseCum = sum(Painmed_Use),FlareLength = n(), Date = max(Date))

# Groups:   yy, Flare [5]
#  Date       Flare Painmed_Use    yy
#  <date>     <int>       <int> <int>
#1 2015-12-06     0           1     1
#2 2015-12-10     1           0     2
#3 2015-12-12     0           0     3
#4 2015-12-15     1           1     4
#5 2015-12-16     0           0     5

Или, если есть больше столбцов для сохранения, лучше использовать mutate и выбрать последнюю строку в каждой группе.

df %>% 
  group_by(yy = {yy = rle(Flare); rep(seq_along(yy$lengths), yy$lengths)}) %>%
  mutate(Painmed_UseCum = sum(Painmed_Use),FlareLength = n()) %>%
  slice(n())

Чтобы создать группы, мы можем заменить rle на rleid из data.table, что было бы проще.

group_by(yy = data.table::rleid(Flare))
...