计算R

时间:2016-04-05 12:41:06

标签: r datetime

这对我来说很难。我有3个月的数据(最多1米的数据),我的data.frame

中有2列
Date_Time                Number
12/1/2015 12:00:01 AM    92222222
12/1/2015 12:00:29 AM    32211111
12/1/2015 12:00:41 AM    22333333
12/1/2015 12:00:43 AM    12222222
.....                    .....
12/1/2015 9:00:02 AM     92222222
12/2/2015 12:00:02 AM    32211111

如何计算列中每个值的出现次数/频率" Number"在24小时的时间范围内。

以上示例的预期结果

92222222 Freq: 2
32211111 Freq: 2
22333333 Freq: 1
12222222 Freq: 1

EDIT
24小时的时间范围是指24小时的间隔。从午夜到午夜并不意味着什么。例如,如果有人今天下午5点拨打电话,并在第二天下午3点再次拨打电话,那么这应该算作2

编辑2: 更清楚的是,此分析的目的是了解呼叫中心24小时窗口期间的重复呼叫次数。

例如,客户在2016年1月1日下午1:32:01从联系电话01101111致电 &安培;然后在2016年1月1日下午1:59:43再次致电。最后称为第二天2016年1月2日下午12:21:02 它被认为是0110111的频率是" 3"因为这个数字在不到24小时内重复了3次。

2 个答案:

答案 0 :(得分:2)

根据您的评论,对于任何号码,期间的开头是该号码最早的电话。 以下是注释代码:

library(lubridate)                                                              
library(dplyr)          

calls <- structure(list(Date_Time = structure(1:6, .Label = c("12/1/2015 12:00:01 AM", 
"12/1/2015 12:00:29 AM", "12/1/2015 12:00:41 AM", "12/1/2015 12:00:43 AM", 
"12/1/2015 9:00:02 AM", "12/2/2015 12:00:02 AM"), class = "factor"), 
    Number = structure(c(4L, 3L, 2L, 1L, 4L, 3L), .Label = c("12222222", 
    "22333333", "32211111", "92222222"), class = "factor")), .Names = c("Date_Time", 
"Number"), row.names = c(NA, -6L), class = "data.frame")


count_freq <- function(timestamps){                                             
    #Given all the ocurrences of calls from a number find the 
    #earliest one and count how many occur within 24 hours
    dtime <- sort(mdy_hms(timestamps))                                            
    start_time <- dtime[1]                                                        
    end_time <- start_time + hours(24)                                            
    sum(dtime >= start_time & dtime <= end_time)                                  
}


out <- group_by(calls, Number) %>% 
       summarise(freq = count_freq(Date_Time)) 

答案 1 :(得分:1)

这是另一种在24小时内输出每行数字频率的方法,但很可能比tfc更慢。

df<-read.table(header = TRUE, sep=",", text="Date_Time,  Number
              12/1/2015 12:00:01 AM,    92222222
               12/1/2015 12:00:29 AM,    32211111
               12/1/2015 12:00:41 AM,    22333333
               12/1/2015 12:00:43 AM,    12222222
               12/1/2015 9:00:02 AM,     92222222
               12/2/2015 12:00:02 AM,    32211111")

df$Date_Time<-as.POSIXct(df$Date_Time, format="%m/%d/%Y %I:%M:%S %p")

library(dplyr)
ncount<-function(x){
  target<-x[2]
  starttime<-as.POSIXct(x[1], format="%Y-%m-%d %H:%M:%S")
  endtime<-starttime+ 24*60*60  #1 day later
  nrow(filter(df, Number==target & Date_Time>=starttime & Date_Time<=endtime))
}

df$freq<-apply(df, 1, function(x){ncount(x)} )