【问题标题】:Count instance of datetime overlap across all rows in R dataframe计算 R 数据框中所有行的日期时间重叠实例
【发布时间】:2017-08-03 07:40:19
【问题描述】:

希望有人可以在这里帮助我。我已经尝试过搜索,但似乎没有什么与我想要做的匹配。

我正在尝试为我的数据框中的每一行计算行日期时间在任何其他行的时间范围内重复的实例数。

我有一个数据框,其中包含 3 个日期时间列,它们是 POSIXt,格式 = dd/mm/yyyy HH:MM。

我希望我的计算出现在一个名为“重复项”的新列中

|Row  | :Start_time:     | :Start_time_beg: | :Start_time_end:|
|--   |------------------|------------------|-----------------|
|1    | 01/01/2017 03:00 | 01/01/2017 01:30 | 01/01/2017 04:30|
|2    | 01/01/2017 04:00 | 01/01/2017 02:30 | 01/01/2017 05:30|
|3    | 01/01/2017 04:10 | 01/01/2017 02:40 | 01/01/2017 05:40|
|4    | 01/01/2017 05:00 | 01/01/2017 03:30 | 01/01/2017 06:30|
|5    | 01/01/2017 08:00 | 01/01/2017 06:30 | 01/01/2017 09:30|

所以在上面的示例数据中,我想计算 Start_time 出现在 Start_time_beg 范围内的每个实例:Start_time_end for rows 1:n

此数据的结果将是:

|Row     |Duplicates|
|----    |----------|
|:1:     | :3:      | (3 as overlaps with rows 1,2,3)
|:2:     | :4:      | (4 overlaps with rows 1,2,3,4)
|:3:     | :4:      | (4 overlaps with rows 1,2,3,4)
|:4:     | :3:      | (3 overlaps with rows 2,3,4)
|:5:     | :1:      | (1 as only overlaps with itself, row 5)

我的想法是为每个 Start_time_beg:Start_time_End 创建一个 seq 数组。然后创建一个数据框,其中包含 Start_time 计数。然后我可以将它加入到原来的 df 中。

目前为止

x <- d1$Start_Time
y <- d1$Start_Time_Beg
z <- d1$Start_Time_End


t <- seq(y[1],z[1],"mins")
t2<- seq(y[2],z[2],"mins")

tn <- c(t,t2)

p<-count(tn,'tn')

这为我提供了时间范围数组中所需的 df(p)。问题是我试图创建一个循环来生成 t:nrows(行数为数千,因此无法手动输入)但我没有看

for (i in 1:length(d1$Start_Time))
{seq(d$Start_Time_Beg[c(1+i)],d$Start_Time_End[c(1+i)],"mins")}

这只是给了我一个 int length = nrows。不是我所追求的日期时间数组。

我什至不确定这是否是解决此问题的正确方法,我曾尝试使用 dplyr 但没有运气。

非常感谢任何帮助。抱歉,我的表格似乎没有正确对齐

提前感谢您的帮助

【问题讨论】:

  • 请进行适当的编辑,这几乎不可读且不可复制/粘贴。
  • 感谢您整理@thomasfritsch

标签: r loops datetime dataframe overlap


【解决方案1】:

data.table 这是一个单行:

library(data.table)   # CRAN verison 1.10.4 used
setDT(DT)
DT[DT, on = .(Start_time >= Start_time_beg, Start_time <= Start_time_end), 
   Duplicates := .N, by = .EACHI][]
     Row          Start_time      Start_time_beg      Start_time_end Duplicates
   <int>              <POSc>              <POSc>              <POSc>      <int>
1:     1 2017-01-01 03:00:00 2017-01-01 01:30:00 2017-01-01 04:30:00          4
2:     2 2017-01-01 04:00:00 2017-01-01 02:30:00 2017-01-01 05:30:00          3
3:     3 2017-01-01 04:10:00 2017-01-01 02:40:00 2017-01-01 05:40:00          3
4:     4 2017-01-01 05:00:00 2017-01-01 03:30:00 2017-01-01 06:30:00          3
5:     5 2017-01-01 08:00:00 2017-01-01 06:30:00 2017-01-01 09:30:00          1

说明

强制转换为data.table 类后,DT 使用非等值连接与其自身连接。连接参数(按每个 i 分组)立即计算多个匹配行 (.N)。最后,计数分配给DT 的新列(加入时更新)。

数据

library(data.table)
options(datatable.print.class = TRUE)

DT <- fread(
  "|Row  | Start_time     | Start_time_beg | Start_time_end|
  |1    | 01/01/2017 03:00 | 01/01/2017 01:30 | 01/01/2017 04:30|
  |2    | 01/01/2017 04:00 | 01/01/2017 02:30 | 01/01/2017 05:30|
  |3    | 01/01/2017 04:10 | 01/01/2017 02:40 | 01/01/2017 05:40|
  |4    | 01/01/2017 05:00 | 01/01/2017 03:30 | 01/01/2017 06:30|
  |5    | 01/01/2017 08:00 | 01/01/2017 06:30 | 01/01/2017 09:30|",
  sep = "|", drop = c(1, 6))
cols <- stringr::str_subset(names(DT), "time")
DT[, (cols) := lapply(.SD, lubridate::dmy_hm), .SDcols = cols]
DT
     Row          Start_time      Start_time_beg      Start_time_end
   <int>              <POSc>              <POSc>              <POSc>
1:     1 2017-01-01 03:00:00 2017-01-01 01:30:00 2017-01-01 04:30:00
2:     2 2017-01-01 04:00:00 2017-01-01 02:30:00 2017-01-01 05:30:00
3:     3 2017-01-01 04:10:00 2017-01-01 02:40:00 2017-01-01 05:40:00
4:     4 2017-01-01 05:00:00 2017-01-01 03:30:00 2017-01-01 06:30:00
5:     5 2017-01-01 08:00:00 2017-01-01 06:30:00 2017-01-01 09:30:00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2021-12-27
    • 2023-01-19
    • 2018-02-28
    相关资源
    最近更新 更多