我拥有庞大的数据框,包含数百万个电子邮件地址及其开放时间。下面是我的数据框的子集。
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小时?
为了在下面提供更多解释,我想要的输出图像 请给我一些解决这个问题的有效方法,因为我有一个大数据。如果您不清楚某些事情,请告诉我,而不是向我投票。
答案 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并不完全像你输出的例子。那是因为我不同意您正在寻找的数据结构。