【问题标题】:Summing Consecutive Rows based on DateTime基于 DateTime 对连续行求和
【发布时间】:2019-07-05 09:05:30
【问题描述】:

我的数据看起来像这样......

Year   Month   Day   Hour  Total  Date       DateTime
1950   1       2     21    0.01   1/2/1950   1/2/1950 21:00
1950   1       2     23    0.01   1/2/1950   1/2/1950 23:00
1950   1       3     0     0.06   1/3/1950   1/3/1950 0:00
1950   1       3     1     0.01   1/3/1950   1/3/1950 1:00
1950   1       3     2     0.02   1/3/1950   1/3/1950 2:00
1950   1       4     11    0.24   1/4/1950   1/4/1950 11:00
1950   1       4     12    0.07   1/4/1950   1/4/1950 12:00
1950   1       4     15    0.10   1/4/1950   1/4/1950 15:00
1950   1       4     16    0.04   1/4/1950   1/4/1950 16:00
1950   1       4     17    0.01   1/4/1950   1/4/1950 17:00

我想按事件或连续小时来汇总“总计”。例如,第一行与第二行不连续,这意味着它们相隔一个多小时且不连续(查看小时或日期时间)。第一行的总和应为 0.01。第二、第三、第四和第五个观察(或行)是连续的(不分开)。所有这四个观察结果都应该加起来,我想要那个总数……等等。 我想要看起来像这样的东西......

Year    Month    Sum
1950    1         0.01
1950    1         0.10
1950    1         0.31
1950    1         0.15

将这些连续的小时数相加,我不想要每天的总数。

【问题讨论】:

    标签: r dplyr lubridate


    【解决方案1】:

    您可以检查观察之间的间隔是否大于一小时,如果使用cumsum,则增加组索引。这使您可以创建连续观察组,然后通过summarise 获得所需的总数。请注意,我将T 添加到DateTime 列中,以便read_table2 将其理解为一列;最佳做法是提供dput,以便我们可以轻松获得您所拥有格式的数据。

    library(tidyverse)
    library(lubridate)
    
    tbl <- read_table2(
    "Year   Month   Day   Hour  Total  Date       DateTime
    1950   1       2     21    0.01   1/2/1950   1/2/1950T21:00
    1950   1       2     23    0.01   1/2/1950   1/2/1950T23:00
    1950   1       3     0     0.06   1/3/1950   1/3/1950T0:00
    1950   1       3     1     0.01   1/3/1950   1/3/1950T1:00
    1950   1       3     2     0.02   1/3/1950   1/3/1950T2:00
    1950   1       4     11    0.24   1/4/1950   1/4/1950T11:00
    1950   1       4     12    0.07   1/4/1950   1/4/1950T12:00
    1950   1       4     15    0.10   1/4/1950   1/4/1950T15:00
    1950   1       4     16    0.04   1/4/1950   1/4/1950T16:00
    1950   1       4     17    0.01   1/4/1950   1/4/1950T17:00"
    ) %>%
      mutate(Date = mdy(Date), DateTime = mdy_hm(DateTime))
    
    tbl %>%
      mutate(group = cumsum(c(0, int_diff(DateTime)) > 3600)) %>%
      group_by(Year, Month, group) %>%
      summarise(Sum = sum(Total))
    #> # A tibble: 4 x 4
    #> # Groups:   Year, Month [?]
    #>    Year Month group   Sum
    #>   <dbl> <dbl> <int> <dbl>
    #> 1  1950     1     0  0.01
    #> 2  1950     1     1  0.1 
    #> 3  1950     1     2  0.31
    #> 4  1950     1     3  0.15
    

    reprex package (v0.2.1) 于 2019 年 2 月 11 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-28
      • 2014-05-11
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多