簡體   English   中英

根據布爾值列中的連續值匯總小標題

[英]Aggregate a tibble based on a consecutive values in a boolean column

我遇到了一個相當直接的問題,但是我一直在努力尋找不需要大量代碼和復雜循環的解決方案。

我有一個匯總表df ,用於每小時的時間序列數據集,其中每個觀察值都屬於一個組。 我想根據匯總表中的布爾值列合並其中一些組。 布爾列merge_with_next指示是否應將給定組與下一個組合並(向下一行)。 通過更新end ,value並刪除行可以有效地進行合並

library(dplyr)

# Demo data
df <- tibble(
  group = 1:12,
  start = seq.POSIXt(as.POSIXct("2019-01-01 00:00"), as.POSIXct("2019-01-12 00:00"), by = "1 day"),
  end = seq.POSIXt(as.POSIXct("2019-01-01 23:59"), as.POSIXct("2019-01-12 23:59"), by = "1 day"), 
  merge_with_next = rep(c(TRUE, TRUE, FALSE), 4)
)

df
#> # A tibble: 12 x 4
#>    group start               end                 merge_with_next
#>    <int> <dttm>              <dttm>              <lgl>          
#>  1     1 2019-01-01 00:00:00 2019-01-01 23:59:00 TRUE           
#>  2     2 2019-01-02 00:00:00 2019-01-02 23:59:00 TRUE           
#>  3     3 2019-01-03 00:00:00 2019-01-03 23:59:00 FALSE          
#>  4     4 2019-01-04 00:00:00 2019-01-04 23:59:00 TRUE           
#>  5     5 2019-01-05 00:00:00 2019-01-05 23:59:00 TRUE           
#>  6     6 2019-01-06 00:00:00 2019-01-06 23:59:00 FALSE          
#>  7     7 2019-01-07 00:00:00 2019-01-07 23:59:00 TRUE           
#>  8     8 2019-01-08 00:00:00 2019-01-08 23:59:00 TRUE           
#>  9     9 2019-01-09 00:00:00 2019-01-09 23:59:00 FALSE          
#> 10    10 2019-01-10 00:00:00 2019-01-10 23:59:00 TRUE           
#> 11    11 2019-01-11 00:00:00 2019-01-11 23:59:00 TRUE           
#> 12    12 2019-01-12 00:00:00 2019-01-12 23:59:00 FALSE

# Desired result
desired <- tibble(
  group = c(1, 4, 7, 9),
  start = c("2019-01-01 00:00", "2019-01-04 00:00", "2019-01-07 00:00", "2019-01-10 00:00"),
  end = c("2019-01-03 23:59", "2019-01-06 23:59", "2019-01-09 23:59", "2019-01-12 23:59")
)

desired
#> # A tibble: 4 x 3
#>   group start            end             
#>   <dbl> <chr>            <chr>           
#> 1     1 2019-01-01 00:00 2019-01-03 23:59
#> 2     4 2019-01-04 00:00 2019-01-06 23:59
#> 3     7 2019-01-07 00:00 2019-01-09 23:59
#> 4     9 2019-01-10 00:00 2019-01-12 23:59

由reprex軟件包(v0.2.1)創建於2019-03-22

我正在尋找一種簡短明了的解決方案,該解決方案不涉及眾多的輔助表和循環。 group列中的最終值並不重要,我只關心結果中的startend列。

我們可以使用dplyr並基於每次merge_with_next列中出現TRUE值時創建組,並為每個組從start列中選擇first last值,從end列中選擇last值。

library(dplyr)

df %>%
  group_by(temp = cumsum(!lag(merge_with_next, default = TRUE))) %>%
  summarise(group = first(group),
            start = first(start), 
            end = last(end)) %>%
  ungroup() %>%
  select(-temp)

#  group start               end     
#  <int> <dttm>              <dttm>             
#1     1 2019-01-01 00:00:00 2019-01-03 23:59:00
#2     4 2019-01-04 00:00:00 2019-01-06 23:59:00
#3     7 2019-01-07 00:00:00 2019-01-09 23:59:00
#4    10 2019-01-10 00:00:00 2019-01-12 23:59:00

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM