【问题标题】:How to create histogram in R with CSV time data?如何使用 CSV 时间数据在 R 中创建直方图?
【发布时间】:2012-01-26 00:16:55
【问题描述】:

我有一个 24 小时的日志 CSV 数据,如下所示:

svr01,07:17:14,'u1@user.de','8.3.1.35'
svr03,07:17:21,'u2@sr.de','82.15.1.35'
svr02,07:17:30,'u3@fr.de','2.15.1.35'
svr04,07:17:40,'u2@for.de','2.1.1.35'

我用tbl <- read.csv("logs.csv")读取数据

如何在直方图中绘制此数据以查看每小时的点击次数? 理想情况下,我会得到 4 个条形图,代表每个 srv01、srv02、srv03、srv04 每小时的点击次数。

感谢您在这里帮助我!

【问题讨论】:

  • 如果你提供一个可重现的例子会有所帮助......
  • 这个想法是你有一个目录,其中包含来自 4 个不同服务器的日志文件,例如server01.log、server02.log、server03.log 和 server04.log。接下来,您对这 4 个文件进行 grep 以获取“登录成功”。你得到以下形式的东西: server01: login successful with parameters ( :login => "u1@user.de", :created_at => "07:17:13", ... ) 你用 awk 重新格式化并得到一个文件,例如logs.csv,内容如上图。
  • 感谢您的反馈。但是,我的意思是可重现的 R 代码,即重现与您的特定 R 问题相关的情况。
  • 好的..我明白了...我有几个小问题导致了我相当普遍的问题。首先,我尝试使用 Zoo 库中的示例: library(zoo) --> 结果:以下对象被 'package:base' 屏蔽:as.Date, as.Date.numeric 我的另一个实验首先是做一些简单的时间尺度图,时间在 X 上,登录在 Y 上。我做了:scale

标签: r time ggplot2 plyr


【解决方案1】:

我不知道我是否理解你的意思,所以我将我的答案分成两部分。第一部分是如何将您的时间转换为可用于绘图的向量。

a) 将您的数据转换为小时数:

  #df being the dataframe
  df$timestamp <- strptime(df$timestamp, format="%H:%M:%S")
  df$hours <-  as.numeric(format(df$timestamp, format="%H"))
  hist(df$hours)

这会为您提供所有服务器的命中率直方图。如果您想拆分直方图,这是一种方法,当然还有很多其他方法:

b) 使用ggplot2制作直方图

 #install.packages("ggplot2")
  require(ggplot2)
  ggplot(data=df) + geom_histogram(aes(x=hours), bin=1) +  facet_wrap(~ server)
  # or use a color instead
  ggplot(data=df) + geom_histogram(aes(x=hours, fill=server), bin=1)

c) 你也可以使用另一个包:

 require(plotrix)
 l <- split(df$hours, f=df$server)
 multhist(l)

示例如下。第三个使比较更容易,但我认为ggplot2 看起来更好。

编辑

这是这些解决方案的样子

第一个解决方案:

第二种解决方案:

第三个解决方案:

【讨论】:

  • 我在帖子中添加了一些示例数据,也许你可以用它来测试你的代码。
  • @PaulHiemstra 谢谢 - 同时我也测试了它。但我喜欢你生成随机时间的方式——我做得更糟糕:D
  • 如果你可以上传你的结果图片,这将使 ggplot 的精彩程度更大:)。它为 OP 提供了更多选择。
  • 在你的第二个直方图中,频率是加起来的,还是超定位的?我更喜欢 facet_wrap 版本。
  • 我也喜欢刻面环绕方式。频率在第二张图像中加起来。不应该吗?
【解决方案2】:

一个示例数据集:

dat = data.frame(server = paste("svr", round(runif(1000, 1, 10)), sep = ""),
                 time = Sys.time() + sort(round(runif(1000, 1, 36000))))

我使用的技巧是创建一个新变量,它只指定记录命中的时间:

dat$hr = strftime(dat$time, "%H")

现在我们可以使用一些plyrmagick:

hits_hour = count(dat, vars = c("server","hr"))

并创建情节:

ggplot(data = hits_hour) + geom_bar(aes(x = hr, y = freq, fill = server), stat="identity", position = "dodge")

看起来像:

我不是很喜欢这个情节,我会更赞成:

ggplot(data = hits_hour) + geom_line(aes(x = as.numeric(hr), y = freq)) + facet_wrap(~ server, nrow = 1)

看起来像:

将所有方面放在一行中可以轻松比较服务器之间的命中数。当使用真实数据而不是我的随机数据时,这看起来会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 2011-12-02
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    相关资源
    最近更新 更多