如何在R中按时间分组并使用ggplot进行绘图?这可以在ggplot中完成吗?

时间:2018-01-29 11:24:29

标签: r ggplot2

我使用R分析应用数据,我发现自己必须按时间分组,所以我可以在ggplot中绘制它,但这看起来并不容易。

我的数据如下:

user_id | session_id | timestamp | time_seconds
 001    |   123      | 2014-01-01|    251
 002    |   845      | 2014-01-01|    514
 003    |   741      | 2014-01-02|    141
 003    |   477      | 2014-01-03|    221
 004    |   121      | 2014-01-03|    120
 005    |   921      | 2014-01-04|    60
...

time_stamp列的格式为as.Date(),因此应将其识别为R的日期。

我需要绘制显示否的线图。在ggplot中随着时间的推移。有没有一种简单的方法在ggplot代码中执行此操作?例如:

ggplot(df, aes(timestamp,count(session_id)))+
  geom_line()

我想在每个日期进行一次会话计数,上面的代码不起作用,只是一个展示我之后的例子。

我还想做的是按月总结。我也想研究特定月份,并希望对数据进行分组。这可以从那行代码完成吗? xlim不是我之后的事情,只是"缩短"轴。

我尝试使用aggregate功能,但结果好坏参半,而不是我真正想要的。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用group_by包中的summarizedplyr

library(dplyr)
library(ggplot2)

df %>%  
  group_by(timestamp) %>% 
  summarise(session_count = n()) %>% 
  ggplot(aes(timestamp, session_count)) + 
  geom_line()

enter image description here

按月汇总数据,您可以:

df %>%  
  mutate(month_timestamp = format(timestamp, "%b %Y")) %>% 
  group_by(month_timestamp) %>% 
  summarise(session_count = n()) %>% 
  ggplot(aes(month_timestamp, session_count)) + 
  geom_line()

这里的情节并没有显示出来,因为您的数据只有一个月。

数据

df <- structure(list(user_id = c("001", "002", "003", "003", "004", "005"), 
                     session_id = c("123", "845", "741", "477", "121", "921"), 
                     timestamp = structure(c(16071, 16071, 16072, 16073, 16073, 16074), 
                                           class = "Date"), 
                     time_seconds = c(251, 514, 141, 221, 120, 60)), 
                .Names = c("user_id", "session_id", "timestamp", "time_seconds"), 
                class = c("tbl_df", "tbl", "data.frame"), 
                row.names = c(NA, -6L))

答案 1 :(得分:0)

也许可以方便地使用lubridate,例如

library(tidyverse)

dat <- data.frame(timestamp = rep(seq.Date(as.Date("2014/01/01"), as.Date("2014/12/24"), "day"), each = 2),
                  sessions = 1)

dat %>% 
  mutate(month = format(timestamp, "%Y-%m")) %>% 
  group_by(month) %>% 
  summarise(sum_session = sum(sessions)) %>% 
  ggplot(data = e, aes(x = month, y = sum_session, group = 1)) + geom_line()