计算 R 中的连续日期以确定事件的长度

如何解决计算 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

我已经尝试了 aggregateaveseq_alonglag 的各种方法,但我没有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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?