查找大数据中最大计数的时间间隔

时间:2017-01-19 13:39:13

标签: r time data.table time-series

我拥有庞大的数据框,包含数百万个电子邮件地址及其开放时间。下面是我的数据框的子集。

enter image description here

dput(droplevels(data))
structure(list(email_address_hash = structure(1:3, .Label = c("0004eca7b8bed22aaf4b320ad602505fe9fa9d26", 
"00198ee5364d73796e0e352f1d2576f8e8fa99db", "35c0ef2c2a804b44564fd4278a01ed25afd887f8"
), class = "factor"), open_times = c(" 04:39:24 10:39:43", " 21:12:04 07:05:23 06:31:24", 
" 09:57:20 19:00:09")), row.names = c(NA, -3L), .Names = c("email_address_hash", 
"open_times"), .internal.selfref = <pointer: 0x0000000007b60788>, class = c("data.table", 
"data.frame"))

我的数据框结构是

str(data)
Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
 $ email_address_hash: Factor w/ 36231 levels "00012aec4ca3fa6f2f96cf97fc2a3440eacad30e",..: 2 16 7632
 $ open_times        : chr  " 04:39:24 10:39:43" " 21:12:04 07:05:23 06:31:24" " 09:57:20 19:00:09"
 - attr(*, ".internal.selfref")=<externalptr> 

我想实现这两个目标

目标: -

1)从00:00:00开始,每隔一小时计算一次,并计算每个客户的条目数。假设第一行的open_times是04:39:24和10:39:43。所以它得到一个计数b / w 4:00:00-5:00和一个计数b / w 10:00:00和11:00:00和零计数所有其他间隔像b / w 00: 00:00和01:00:00等等。我只想要前两个具有最大条目数的计数。在这种情况下,它是4:00:00-5:00:00和10:00:00-11:00:00以及它们在其他列中的相应计数

2)对于相同的情况,是否可以将时间间隔从1小时更改为1.5小时或2小时?

为了在下面提供更多解释,我想要的输出图像 enter image description here 请给我一些解决这个问题的有效方法,因为我有一个大数据。如果您不清楚某些事情,请告诉我,而不是向我投票。

1 个答案:

答案 0 :(得分:0)

对于初学者来说,将数据重组为可用于汇总数据的长格式。此示例使用dplyr包。

研究如何处理时间和日期,使其更加复杂。我只是把时间的不同组成部分分开了。

require(dplyr)
require(tidyr)

norm <- df %>% mutate(times=trimws(open_times)) %>% 
  separate(times,c('t1','t2','t3','t4'), sep = " ") %>%
  gather(key, value, -email_address_hash,-open_times) %>% 
  filter(!is.na(value)) %>%
  separate(value, into = c('hr','min','sec'), sep=":") 


norm %>%
  group_by(hr) %>% summarise(n = n())

结果

# A tibble: 7 × 2
hr     n
<chr> <int>
04     1
06     1
07     1
09     1
10     1
19     1
21     1

您可以使用不同的时间间隔计算组:

interval <- 90

norm %>% 
  mutate(minutes = 60*as.numeric(hr)+as.numeric(min),
  group = (minutes-minutes%%interval)/interval) %>%
  group_by(group) %>% summarise(n = n())

我计算自午夜起的分钟数,并使用该值制作90分钟(1.5小时)的小组。

这是规范化数据的结构:

> str(norm)
'data.frame':   7 obs. of  6 variables:
  $ email_address_hash: Factor w/ 3 levels "0004eca7b8bed22aaf4b320ad602505fe9fa9d26",..: 1 2 3 1 2 3 2
$ open_times        : chr  " 04:39:24 10:39:43" " 21:12:04 07:05:23 06:31:24" " 09:57:20 19:00:09" " 04:39:24 10:39:43" ...
$ key               : chr  "t1" "t1" "t1" "t2" ...
$ hr                : chr  "04" "21" "09" "10" ...
$ min               : chr  "39" "12" "57" "39" ...
$ sec               : chr  "24" "04" "20" "43" ...

要生成您在示例中添加的结果,您可以使用:

norm %>% 
  mutate(minutes = 60*as.numeric(hr)+as.numeric(min),
  group = floor(minutes/120)) %>% 
  mutate(label = paste0(group*2,":00-",group*2+2,":00" )) %>%
  group_by(email_address_hash, label) %>% summarise(n = n()) %>%
  spread(label, n)

结果是:

email_address_hash `10:00-12:00` `18:00-20:00` `20:00-22:00` `4:00-6:00` `6:00-8:00`  `8:00-10:00`
<fctr>             <int>         <int>         <int>         <int>       <int>        <int>
0004eca7...        1             NA            NA             1          NA           NA
00198ee5...        NA            NA            1             NA           2           NA
35c0ef2c...        NA            1             NA            NA          NA            1

Allthought并不完全像你输出的例子。那是因为我不同意您正在寻找的数据结构。