用R中的条件汇总时间序列列

时间:2017-12-04 21:50:15

标签: r dataframe dplyr data.table data-cleaning

我遇到了这个时间序列数据集的可能聚合/汇总问题。

下面是一个数据集,其中包含来自互联网聊天系统的聊天的唯一实例。

chatId  agentId beginning_timestamp ending_timestamp    answer
    1   22      4/07/2016 9:00      4/07/2016 9:30      1
    2   22      4/07/2016 9:26      4/07/2016 9:35      5
    3   22      4/07/2016 9:15      4/07/2016 9:19      5
    4   10      4/07/2016 11:17     4/07/2016 12:13     2
    5   10      4/07/2016 11:29     4/07/2016 11:50     1
  • 唯一ID字段是chatId。
  • agentId是接收此聊天的唯一代理
  • beginning_timestamp是聊天开始的时间
  • ending_timestamp是聊天结束的时间
  • 答案是用于以后分析的连续变量

我想使用dplyr(或其他任何东西)以这种方式汇总以下数据集:

  • 对于每个组(agentId和chatId),查看是否在同一时间段内发生了另一次聊天(从begin_timestamp加上5分钟到结束时间戳--5分钟)
  • 如果有聊天,请写下这个独特的聊天事件,而另一个聊天正在进行中。

这是一个结果数据集,其中包含一个额外的列(multiple_chats =一个离散变量可以做):

    chatId  agentId beginning_timestamp ending_timestamp    answer   multiple_chats
        1   22      4/07/2016 9:00      4/07/2016 9:30      1          1
        2   22      4/07/2016 9:26      4/07/2016 9:35      5          0
        3   22      4/07/2016 9:15      4/07/2016 9:19      5          1
        4   10      4/07/2016 11:17     4/07/2016 12:13     2          1
        5   10      4/07/2016 11:29     4/07/2016 11:50     1          1

感谢任何答案。

1 个答案:

答案 0 :(得分:1)

看起来您的某些重叠可能与您在“结果数据集”中显示的重叠不同,但这里有一些来自here的输入

df <- data.frame(chatID = 1:5, agentID = c(22,22,22,10,10), 
             beginning_timestamp = c('4/07/2016 9:00', '4/07/2016 9:26', '4/07/2016 9:15', '4/07/2016 11:17', '4/07/2016 11:29'),
             ending_timestamp = c('4/07/2016 9:30', '4/07/2016 9:35', '4/07/2016 9:19', '4/07/2016 12:13', '4/07/2016 11:50'),
             answer = c(1,5,5,2,1))

1

ibrary(tidyverse)
library(lubridate)

df %>% 
  mutate(beginning_timestamp = mdy_hm(beginning_timestamp),
         ending_timestamp = mdy_hm(ending_timestamp),
         int = interval(beginning_timestamp + minutes(5), 
                        ending_timestamp - minutes(5))) -> df

df$multiple_chats = unlist(tapply(df$int, df$agentID, 
                           function(x) as.numeric(rowSums(outer(x, x, int_overlaps))>1)))