使用 dplyr 汇总但保留组行的日期

Use dplyr to summarize but preserve date of group row

我有一个如下所示的数据框:

          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 查找每个耀斑的长度以及每个耀斑期间的总药物使用量。我目前的解决方案(灵感来自 ),

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

注意:在某些方面,这是我之前的一个问题 () 的跟进,但我试图让这个问题更简单,虽然可能对其他人有用,但最终需要这个进一步的问题。

您可以在 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 和 select。

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 替换为 data.table 中的 rleid,这样会更简单。

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