如何在新事件从 BeginTime 和 EndTime 开始时计算当前经过的事件数
How to Count Number of Events Currently Elapsing When a New Event Begins from BeginTime and EndTime
这是一些示例数据:
Begin = c("10-10-2010 12:15:35", "10-10-2010 12:20:52", "10-10-2010 12:23:45", "10-10-2010 12:25:01", "10-10-2010 12:30:29")
End = c("10-10-2010 12:24:23", "10-10-2010 12:23:30", "10-10-2010 12:45:15", "10-10-2010 12:32:11", "10-10-2010 12:45:05")
df = data.frame(Begin, End)
我想在新事件开始时统计当前尚未结束的事件数,并将其记录在新的列中。因此,对于这个特定示例,所需的最终结果将是一个包含以下值的列:0, 1, 1, 1, 2
我需要用 R 编写代码。我找到了一种在 SAS 中使用滞后函数来计算它的方法,但出于各种原因我不喜欢这种方法,并且希望在 R 中能更好地工作。
实际上我有 36,000 行,这是在处理停电问题。
有人问我post我试过了,嗯。正如我所说,在 SAS 中,我成功地使用了滞后函数。该方法效果不佳,因为您必须进行大量硬编码并且效率不高。
在 R 中,我尝试按开始时间和从 1-36k 的数字排序,然后按结束时间和从 1-36k 的数字排序,然后尝试一些 ifthen 逻辑,但碰壁了,我认为这也行不通。
我的问题被告知要编辑以再次提供给社区。我能想象的唯一原因是因为可能的答案太多了。好吧,我没有编辑任何东西,但我添加了这段摘录。在编程中,任何 'good' 问题都不是最简单的问题(但即使是那些也有很多答案,尤其是在 R 中)的问题都会有很多答案。这个问题我知道很多人会一直问,坦率地说,很难找到关于如何在 R 在线中执行此操作的信息来源。这个问题的答案非常简短,而且效果很好。不向社区提供这个问题将是一种耻辱,因为 Whosebug 的目的是获得一系列伟大的问题,所以基本上当人们 google 沿着那个问题的方向做事时,他们的名字就会被拉出来。
也许这有帮助:
library(lubridate)
library(data.table)
df <- as.data.frame(lapply(df, dmy_hms))
dt <- as.data.table(df)
setkey(dt,Begin,End)[,id:=.I]
merge(dt, foverlaps(dt,dt)[id>i.id,.N,by="Begin,End"], all.x=T)[,id:=NULL][is.na(N),N:=0][]
# Begin End N
# 1: 2010-10-10 12:15:35 2010-10-10 12:24:23 0
# 2: 2010-10-10 12:20:52 2010-10-10 12:23:30 1
# 3: 2010-10-10 12:23:45 2010-10-10 12:45:15 1
# 4: 2010-10-10 12:25:01 2010-10-10 12:32:11 1
# 5: 2010-10-10 12:30:29 2010-10-10 12:45:05 2
这是一些示例数据:
Begin = c("10-10-2010 12:15:35", "10-10-2010 12:20:52", "10-10-2010 12:23:45", "10-10-2010 12:25:01", "10-10-2010 12:30:29")
End = c("10-10-2010 12:24:23", "10-10-2010 12:23:30", "10-10-2010 12:45:15", "10-10-2010 12:32:11", "10-10-2010 12:45:05")
df = data.frame(Begin, End)
我想在新事件开始时统计当前尚未结束的事件数,并将其记录在新的列中。因此,对于这个特定示例,所需的最终结果将是一个包含以下值的列:0, 1, 1, 1, 2
我需要用 R 编写代码。我找到了一种在 SAS 中使用滞后函数来计算它的方法,但出于各种原因我不喜欢这种方法,并且希望在 R 中能更好地工作。
实际上我有 36,000 行,这是在处理停电问题。
有人问我post我试过了,嗯。正如我所说,在 SAS 中,我成功地使用了滞后函数。该方法效果不佳,因为您必须进行大量硬编码并且效率不高。
在 R 中,我尝试按开始时间和从 1-36k 的数字排序,然后按结束时间和从 1-36k 的数字排序,然后尝试一些 ifthen 逻辑,但碰壁了,我认为这也行不通。
我的问题被告知要编辑以再次提供给社区。我能想象的唯一原因是因为可能的答案太多了。好吧,我没有编辑任何东西,但我添加了这段摘录。在编程中,任何 'good' 问题都不是最简单的问题(但即使是那些也有很多答案,尤其是在 R 中)的问题都会有很多答案。这个问题我知道很多人会一直问,坦率地说,很难找到关于如何在 R 在线中执行此操作的信息来源。这个问题的答案非常简短,而且效果很好。不向社区提供这个问题将是一种耻辱,因为 Whosebug 的目的是获得一系列伟大的问题,所以基本上当人们 google 沿着那个问题的方向做事时,他们的名字就会被拉出来。
也许这有帮助:
library(lubridate)
library(data.table)
df <- as.data.frame(lapply(df, dmy_hms))
dt <- as.data.table(df)
setkey(dt,Begin,End)[,id:=.I]
merge(dt, foverlaps(dt,dt)[id>i.id,.N,by="Begin,End"], all.x=T)[,id:=NULL][is.na(N),N:=0][]
# Begin End N
# 1: 2010-10-10 12:15:35 2010-10-10 12:24:23 0
# 2: 2010-10-10 12:20:52 2010-10-10 12:23:30 1
# 3: 2010-10-10 12:23:45 2010-10-10 12:45:15 1
# 4: 2010-10-10 12:25:01 2010-10-10 12:32:11 1
# 5: 2010-10-10 12:30:29 2010-10-10 12:45:05 2