【问题标题】:R language split data frame into relevant format for graphR语言将数据框拆分为相关的图形格式
【发布时间】:2016-11-01 17:48:11
【问题描述】:

我有一个包含 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 地址”等。

我正在尝试将上述内容转换为一种易于使用的格式,在该格式中我可以按计数对“好”布尔值进行排序,并将其分组为 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"),但这并没有保留布尔状态,还给了我一个不可绘制的对象。

我尝试了lapply(split(votes, cut(votes$date, "hour")), function(x) summary (x[2])),这是我在网上找到的,恰好适合我的用例,但是

1) 除了剪切和拆分之外,我不了解很多正在发生的事情 2)它给了我一个列表,其中包含一个字符日期,后跟一个字符块,我无法绘制

我应该在这里采取哪些转变和步骤?我尝试过聚合,但我总是失去 TRUE/FALSE 的区别。

我们的目标是制作一个每小时间隔有两个彩色条的图,蓝色表示在该小时间隔内注册的完全正确和红色表示完全错误。

【问题讨论】:

  • 请给出一个工作示例,以便我们进行测试。你可以使用 dput()
  • @timat 我很乐意,但我不能,因为我实际上正在使用敏感的生产数据并且无法复制它。我得到了答案。非常感谢您的关注。

标签: r graph


【解决方案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")

使用cut生成小时类别

dt$break_hour <- cut(dt$date, breaks="hour")

使用 data.table(比 aggregate 等 R 函数库更快)创建列

dt <- dt[,list(good = sum(good), bad = sum(!good)), by=break_hour ]

【讨论】:

    【解决方案2】:

    这是基于您的示例数据使用dplyr 的一种方法,假设df$DatePOSIXct 类型。

    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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2021-06-18
    • 2017-03-29
    • 2021-12-29
    相关资源
    最近更新 更多