我有一个包含以下12,000行的数据集(显然IP地址已更改):
Date good? ip
11670 2016-10-31 00:03:30 TRUE 127.0.0.1
11671 2016-10-31 00:03:23 TRUE 127.0.0.1
11672 2016-10-31 00:03:20 TRUE 127.0.0.1
11673 2016-10-31 00:03:11 TRUE 127.0.0.1
11674 2016-10-31 00:03:08 TRUE 127.0.0.1
11675 2016-10-31 00:02:59 FALSE 127.0.0.1
11676 2016-10-31 00:02:53 TRUE 127.0.0.1
11677 2016-10-31 00:02:49 FALSE 127.0.0.1
11678 2016-10-31 00:02:44 FALSE 127.0.0.1
11679 2016-10-31 00:02:40 TRUE 127.0.0.1
所以,我已经做了一些事情,比如“获取超过100行组合TRUE和FALSE的所有IP地址”等。
我正在尝试采用上述方法并将其转换为易于耕作的格式,我可以按计数对“好”bool进行排序,并将其分组为1小时的间隔。类似的东西:
date TRUE FALSE
2016-10-31 00:00:00 342 1010
2016-10-31 01:00:00 544 890
我尝试了cut.POSIXt(data$date, breaks = "hour")
,但这并没有保留bool状态,也给了我一个不可插拔的对象。
我尝试了lapply(split(votes, cut(votes$date, "hour")), function(x) summary (x[2]))
,我在网上找到了它,恰好适合我的用例,但是
1)我不了解切割和分割之外发生的很多事情 它给了我一个列表,其中包含一个以字符为单位的日期,后面是一串字符,我无法绘制
我应该在这里采取什么样的转变和步骤?我尝试了聚合,但我总是失去TRUE / FALSE区别。
目标是制作一个每小时间隔有两个彩色条形的图,蓝色表示总真实,红色表示在该小时间隔内记录的总误差。
答案 0 :(得分:1)
以下是data.table
library(data.table)
dt <- data.table(df)
更改与您的日期格式对应的格式,在您的示例中,看起来数据前面有一个id,您应该先删除它。
dt$date<- as.POSIXct(dt$date,format="%d/%m/%Y %H:%M", tz = "GMT")
使用剪切生成小时类别
dt$break_hour <- cut(dt$date, breaks="hour")
使用data.table(比aggregate
之类的R fuinction base更快)来创建列
dt <- dt[,list(good = sum(good), bad = sum(!good)), by=break_hour ]
答案 1 :(得分:0)
以下是基于您的示例数据使用dplyr
的一种方法,假设df$Date
属于POSIXct
类型。
library(dplyr)
library(tidyr)
df %>%
group_by(date = format(Date, "%Y-%m-%d"),
hour = format(Date, "%H"),
good = as.character(good)) %>%
summarise(count = n()) %>%
spread(key = good, value = count)
# date hour `FALSE` `TRUE`
#* <chr> <chr> <int> <int>
#1 2016-10-31 00 3 7
如果您的目的是绘图,您可能不需要spread()
的最后一步,并且可以使用之前的内容将其插入到ggplot2
中。