r - 在时间序列中查找不同的范围
问题描述
我想知道如何在时间序列中找到几个范围。我有这个时间序列:
DATE
1 1996-01-01
2 1996-01-02
3 1996-01-03
4 1998-07-13
5 1998-07-14
6 1998-07-15
7 2000-05-28
我想拥有这样的所有时间范围:
[1] "1996-01-01" "1996-01-03"
[2] "1998-07-13" "1998-07-15"
[3] "2000-05-28"
有人知道该怎么做吗?谢谢
解决方案
一种选择是通过获取相邻元素的差异来创建分组列并使用它来创建范围
library(dplyr)
library(lubridate)
df1 %>%
mutate(DATE= ymd(DATE)) %>%
group_by(grp = cumsum(c(TRUE, diff(DATE) > 1))) %>%
summarise(min = min(DATE), max = max(DATE))
# A tibble: 3 x 3
# grp min max
# <int> <date> <date>
#1 1 1996-01-01 1996-01-03
#2 2 1998-07-13 1998-07-15
#3 3 2000-05-28 2000-05-28
或base R
使用split
lapply(with(df1, split(DATE, cumsum(c(TRUE, diff(as.Date(DATE)) > 1)))),
function(x) unique(range(x)))
#$`1`
#[1] "1996-01-01" "1996-01-03"
#$`2`
#[1] "1998-07-13" "1998-07-15"
#$`3`
#[1] "2000-05-28"
数据
df1 <- structure(list(DATE = c("1996-01-01", "1996-01-02", "1996-01-03",
"1998-07-13", "1998-07-14", "1998-07-15", "2000-05-28")),
class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7"))
推荐阅读
- javascript - 蜂群情节没有崩溃
- javascript - 使用javascript从表格中仅填充的表单输入字段中获取数据的问题
- android - 为什么 Android Studio 在没有通知或错误消息的情况下自动关闭
- python - 训练和验证损失过快变得恒定
- python - 如何检测 PyQt5 中的碰撞
- python - 访问更新的全局变量 python
- encoding - 编码随机森林调查数据的字符串特征
- java - 无法处理此确认消息 - Selenium WebDriver
- yaml - 使用 yq -Y 命令时出现错误
- perl - 如何为 Net::WebSocket::Server 程序编写客户端程序?