如何解决计算 R 中的连续日期以确定事件的长度
我有一个包含给定事件发生日期的数据框。有些事件会持续几天,我想根据每个事件的开始日期和总长度(以天为单位)来总结每个事件。
我想从这里开始:
日期 |
---|
2020-01-01 |
2020-01-02 |
2020-01-03 |
2020-01-15 |
2020-01-20 |
2020-01-21 |
为此:
开始日期 | 事件长度 |
---|---|
2020-01-01 | 3 |
2020-01-15 | 1 |
2020-01-20 | 2 |
我已经尝试了 aggregate、ave、seq_along 和 lag 的各种方法,但我没有t 设法获得了事件长度的计数,该计数在日期不连续时重置。
示例数据框的代码,以防万一:
Date <- c("2020-01-01","2020-01-02","2020-01-03","2020-01-15","2020-01-20","2020-01-21")
df <- data.frame(Date)
df$Date <- as.Date(df$Date,origin = "1970-01-01")
解决方法
您可以通过 split
cumsum(c(0,diff(df$Date) != 1)
然后取第一个日期并将其与 length
结合,假设 日期已排序。
do.call(rbind,lapply(split(df$Date,cumsum(c(0,diff(df$Date) != 1))),function(x) data.frame(StartDate=x[1],EventLength=length(x))))
# StartDate EventLength
#0 2020-01-01 3
#1 2020-01-15 1
#2 2020-01-20 2
或使用 rle
的其他选项:
i <- cumsum(c(0,diff(df$Date) != 1))
data.frame(StartDate = df$Date[c(1,diff(i)) == 1],EventLength=rle(i)$lengths)
# StartDate EventLength
#1 2020-01-01 3
#2 2020-01-15 1
#3 2020-01-20 2
,
这是一个带有 cumsum
技巧后跟 ave/table
的基本 R 解决方案。
d <- c(0,diff(df$Date) != 1)
res <- ave(df$Date,cumsum(d),FUN = function(x) x[1])
res <- as.data.frame(table(a))
names(res) <- c("Date","EventLength")
res
# Date EventLength
#1 2020-01-01 3
#2 2020-01-15 1
#3 2020-01-20 2
,
我建议 dplyr
方法,这与@Rui 的方法非常相似
df %>% mutate(dummy = c(0,diff(Date))) %>%
group_by(grp = cumsum(dummy != 1)) %>%
summarise(Date = first(Date),event_count = n(),.groups = 'drop')
# A tibble: 3 x 3
grp Date event_count
<int> <date> <int>
1 1 2020-01-01 3
2 2 2020-01-15 1
3 3 2020-01-20 2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。