我有一个大型数据集,其中包含每日值,指示一年中的特定一天是否特别热(用 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/