R语言将数据帧拆分为图

时间:2016-11-01 08:50:00

标签: r graph

我有一个包含以下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区别。

目标是制作一个每小时间隔有两个彩色条形的图,蓝色表示总真实,红色表示在该小时间隔内记录的总误差。

2 个答案:

答案 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中。