【问题标题】:Filter eventlogs that are within a time-interval in R using dplyr使用 dplyr 过滤 R 中某个时间间隔内的事件日志
【发布时间】:2018-08-13 00:57:23
【问题描述】:

我有以下格式的事件日志。

Original format
我已经使用 dplyr 按 DATE 和 ID 创建了组,因此日期或 ID 的更改将被视为不同的组。

我只想拥有 >= 5 秒时间间隔的事件并删除其余事件。 Desired output

我已经使用 dplyr 和时间延迟来实现这一点,因为我无法为此动态分配延迟间隔。但是我当前的代码检查了一个滞后间隔,我最终删除了比预期更多的行。Current output - all rows in yellow are removed。理想情况下,我想要“13:10:22”, 第 2 组中的“13:10:24”要保留,因为从“13:10:17”到这些时间的时间滞后是 5 秒或更多。

我使用“chron”来处理时间。 我知道时间滞后逻辑在我的情况下不起作用。除了使用昂贵的 for/if 循环之外,还有更好的选择吗?

我用过的代码

data$Date <- as.Date(data$Date,format = "%m/%d/%Y")  
data$Time <- chron(times = data$Time)  

data <- data  %>% arrange(Date,Time,ID)    
data$Group <- data %>%  group_by(Date,ID) %>% group_indices    
data <- data %>%     
        group_by(Group)  %>%       
        mutate(time.difference = Time - lag(Time)) %>%    
        filter(time.difference >= 0.00005787 | is.na(time.difference))  

数据输入

结构(列表(日期=结构(c(17469、17469、17469、17469、 17469、17469、17469、17469、17469、17469、17469、17469、17469、 17469, 17469, 17470, 17470, 17470, 17470), class= "日期"), 时间 = 结构(c(0.936400462962963, 0.9425、0.9425、0.942511574074074、0.942523148148148、0.9703125、 0.548518518518519, 0.548530092592593, 0.54880787037037, 0.54880787037037, 0.548819444444444, 0.548842592592593, 0.548865740740741, 0.548888888888889, 0.557337962962963, 0.6140625, 0.618761574074074, 0.618958333333333, 0.622303240740741), 格式 = "h:m:s", class= "次"), ID = c("P1", “P1”、“P1”、“P1”、“P1”、“P1”、“P5”、“P5”、“P5”、“P5”、“P5”、“P5”、 “P5”,“P5”,“P5”,“P9”,“P9”,“P9”,“P9”)),.Names = c(“日期”, "时间", "ID"), row.names = c(NA, -19L), class= "data.frame")

【问题讨论】:

  • 请用dput展示一个可重复的小例子
  • @akrun 添加了数据。

标签: r dplyr cut cumsum difftime


【解决方案1】:
library(dplyr)
data %>%
  group_by(Group) %>%
  arrange(Group, Date, Time) %>% 
  filter((Time - lag(Time)) >= 5.787037e-05 | row_number() == 1L)

【讨论】:

  • 谢谢.. 但这并不能解决我在 group2 中包含“13:10:22”、“13:10:24”的问题。我不是在看立即的时间滞后。给定一个事件,我不想包括接下来的 n 个少于 4 秒的事件。我只想包含 >= 5 秒的事件。此外,上面的代码不包括时间滞后将返回 NA 的组的第一个元素。像跳过逻辑这样的东西在这里工作吗
  • 谢谢..希望我能早点看到这个..我使用了不同的逻辑并解决了这个..首先我将日期和时间组合为 posixct 对象,然后进行了一些计算..附加我的代码
【解决方案2】:
data$datetime <- as.POSIXct(paste(data$Date, data$Time), format="%m/%d/%Y %H:%M:%S")  
data$group <-  data %>% group_by(ID,by5sec=cut(datetime, breaks="5 sec")) %>%  group_indices
data_filter <- data %>% group_by(group) %>% filter(row_number()==1)

我分两步完成此操作,因为我希望将带有组索引的中间结果写入 CSV。

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2018-11-01
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多