r - 识别/描述向量中具有特定值的连续几天的序列

我有一个大型数据集,其中包含每日值,指示一年中的特定一天是否特别热(用 1 或 0 表示)。我的目标是识别 3 个或更多特别炎热的日子的序列,并创建一个包含每个日子的长度以及开始和结束日期的新数据集。

我对如何去做这件事有点困惑。

我的数据集示例:

hotday <- c(0,1,0,1,1,1,0,0,1,1,1,1,0)
dates <- seq.Date(from=as.Date("1990-06-01"), by="day",length.out = length(hotday))
df <- data.frame(dates,hotday)
df
        dates hotday
1  1990-06-01      0
2  1990-06-02      1
3  1990-06-03      0
4  1990-06-04      1
5  1990-06-05      1
6  1990-06-06      1
7  1990-06-07      0
8  1990-06-08      0
9  1990-06-09      1
10 1990-06-10      1
11 1990-06-11      1
12 1990-06-12      1
13 1990-06-13      0

我想要实现的输出应该如下所示:

   startdate    enddate length
1 1990-06-04 1990-06-06      3
2 1990-06-09 1990-06-12      4

感谢您的帮助,我愿意接受任何方法或建议。

最佳答案

如果你更喜欢 tidyverse 语法,你可以这样做

library(dplyr) 

df %>% 
  mutate(run = cumsum(c(1, abs(diff(hotday))))) %>%
  filter(hotday == 1) %>%
  group_by(run) %>%
  summarize(startdate = first(dates), enddate = last(dates), length = n()) %>%
  ungroup() %>%
  select(-run) %>%
  filter(length >= 3)
#> # A tibble: 2 x 3
#>   startdate  enddate    length
#>   <date>     <date>      <int>
#> 1 1990-06-04 1990-06-06      3
#> 2 1990-06-09 1990-06-12      4

创建于 2022-09-30 reprex v2.0.2

https://stackoverflow.com/questions/73911595/

相关文章:

rust - -1 和 pow 的特殊行为

haskell - 我可以在 Haskell 中将数字全局限制为只有 3 位小数吗?

regex - 包含至少两个数字/字母的序列的 Python 正则表达式

c++ - 如何在始终选择第一个元素并过滤其余元素的范围内创建 View ?

bash - 使用 sed 删除算术形式

python - 在代表 python 中大文件的大字符串上加速 re.sub()?

c++ - 我可以继承 std::array 并重载 operator [] 吗?

Python - 如何删除以数字开头并包含句点的单词

rust - Rust 中的一个可变借用或多个不可变借用……为什么?

regex - 为什么 Perl 正则表达式不匹配 "\n"和后面的字符?