r - 比较同一数据框中的日期间隔

标签 r date overlapping

我四处搜索并找到类似的问题,但可以使其适用于我的数据。

我有一个包含开始日期和结束日期以及其他几个因素的数据框。理想情况下,行的开始日期应晚于任何前一行的结束日期,但数据具有重复的开始或结束日期,有时日期间隔重叠。

我尝试制作一个可重现的示例:

df = data.frame(start=c("2018/04/15 9:00:00","2018/04/15 9:00:00","2018/04/16 10:20:00","2018/04/16 15:30:00",
                   "2018/04/17 12:40:00","2018/04/17 18:50:00"),
                end=c("2018/04/16 8:00:00","2018/04/16 7:10:00","2018/04/17 18:20:00","2018/04/16 16:30:00",
                   "2018/04/17 16:40:00","2018/04/17 19:50:00"),
                value=c(10,15,11,13,14,12))

我能够删除重复的(结束或开始日期),但无法删除重叠的间隔。我想创建一个循环来“清理”任何较大间隔内包含的间隔。所以结果看起来像这样:

result = df[c(1,3,6),]

我以为我可以创建一个循环来“清理”重复项和重叠间隔,但我无法使其工作。

有什么建议吗?

最佳答案

data.table 包使用重叠连接函数 foverlaps(受到 Bioconductor 包 IRanges 中的 findOverlaps 函数的启发)适合解决此类问题,然后使用反函数-join(data.table 语法为 B[!A, on])以删除这些内部间隔。

library(data.table)
cols <- c("start", "end")
setDT(df)
df[, (cols) := lapply(.SD, function(x) as.POSIXct(x, format="%Y/%m/%d %H:%M:%S")), .SDcols=cols]
setkeyv(df, cols)
anti <- foverlaps(df, df, type="within")[start!=i.start | end!=i.end | value!=i.value]
df[!anti, on=.(start=i.start, end=i.end, value=i.value)]

#                  start                 end value
# 1: 2018-04-15 09:00:00 2018-04-16 08:00:00    10
# 2: 2018-04-16 10:20:00 2018-04-17 18:20:00    11
# 3: 2018-04-17 18:50:00 2018-04-17 19:50:00    12

关于r - 比较同一数据框中的日期间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50016889/

相关文章:

r - ggplot 百分比乘以 100

r - 如何对一列值求和并按另一列的间隔对它们进行分组

R ggplot2 : draw segment between points

r - 通过 data.table 中时间间隔的逻辑子集定义变量

c# - Java 格式 Date to UTC 有时会产生 '????-??-??T??:??:??.???Z'

java - JPanel 图像背景与其他 JPanel 重叠

javascript - 按值而非引用将日期插入数组

php - 使用 php 将时间转换为不同的时区

html - 出现下拉菜单时div向右移动

ruby-on-rails - 在 Rails 应用程序上使用 Prawn gem 重复页脚与当前页面和每页的总页数,但重叠当前页码