如何使用CSV时间数据在R中创建直方图?

pos*_*eid 3 time r ggplot2 plyr

我有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'
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你在这里帮助我!

Seb*_*Seb 9

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

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)
Run Code Online (Sandbox Code Playgroud)

这为您提供了所有服务器的命中直方图.如果你想分割直方图,这是一种方式,但当然还有很多其他方法:

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)
Run Code Online (Sandbox Code Playgroud)

c)您还可以使用另一个包:

 require(plotrix)
 l <- split(df$hours, f=df$server)
 multhist(l)
Run Code Online (Sandbox Code Playgroud)

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

编辑

以下是这些解决方案的样子

第一个解决方 在此输入图像描述

二解决方案: 在此输入图像描述

第三种方案: 在此输入图像描述


Pau*_*tra 8

示例数据集:

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

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

dat$hr = strftime(dat$time, "%H")
Run Code Online (Sandbox Code Playgroud)

现在我们可以使用一些plyr魔法:

hits_hour = count(dat, vars = c("server","hr"))
Run Code Online (Sandbox Code Playgroud)

并创建情节:

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

看起来像:

在此输入图像描述

我真的不喜欢这个情节,我更赞成:

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

看起来像:

在此输入图像描述

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