【问题标题】:Use dplyr to summarize but preserve date of group row使用 dplyr 汇总但保留组行的日期
【发布时间】:2020-05-15 15:39:30
【问题描述】:

我有一个如下数据框:

          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 查找每个耀斑的长度以及每次耀斑期间的总药物使用量。我目前的解决方案(灵感来自Use rle to group by runs when using 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 code to get max count of time series data by group) 的后续问题,但我试图让这个问题更简单,虽然可能对其他人有用,但最终需要这个进一步的问题。

【问题讨论】:

    标签: r dplyr time-series summarize preserve


    【解决方案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 并选择每个组中的最后一行。

    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.tablerleid,这样会更简单。

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

    【讨论】:

    • 哇!很有帮助。再次感谢罗纳克。我认为,您的回答也将有助于我概括。
    猜你喜欢
    • 1970-01-01
    • 2022-07-21
    • 2016-12-29
    • 2016-12-30
    • 1970-01-01
    • 2023-01-14
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多