首页 > 解决方案 > 绘制作为星期几和一天中时间函数的买入比率直方图

问题描述

我有一个带有 34154695 obs 的数据框。在数据集中,值为 0 的 Class 变量表示“未购买”,1 表示“购买”。

> str(data)
'data.frame':   34154695 obs. of  5 variables:
 $ SessionID: int  1 1 1 2 2 2 2 2 2 3 ...
 $ Timestamp: Factor w/ 34069144 levels "2014-04-01T03:00:00.124Z",..: 1452469 1452684 1453402 1501801 1501943 1502207 1502429 1502569 1502932 295601 ...
 $ ItemID   : int  214536500 214536506 214577561 214662742 214662742 214825110 214757390 214757407 214551617 214716935 ...
 $ Category : Factor w/ 339 levels "0","1","10","11",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Class    : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...

我很难找到一种解决方案来绘制基于类值 = 1 的每周、每天和时间明智的购买数量的直方图,并希望输出如下图所示。

在此处输入图像描述 在此处输入图像描述

我尝试了这段代码但得到了错误

library(dplyr)
library(lubridate)



x <- strptime(data$Timestamp, format = "%Y-%m-%d")#assume you need only days/month , assign to a variable, because dplyr has problems with with date type.

data$month <- month(x) #get month from date obj.

month_summ <- data %>% group_by(month) %>%  #group by month and calculated sold items per month
  summarise(
    total_sales = n()
  )


library(ggplot2)



 ggplot(data=month_summ, aes(x=month, y=ItemID)) +   geom_bar(stat="identity") #plot the histogram

grouped_df_impl(data, unname(vars), drop) 中的错误:列日期属于不支持的类 POSIXlt/POSIXt

有人可以告诉我应该如何进行吗?真的,感谢您的任何帮助和建议。

亲切的问候

标签: rhistogram

解决方案


这个问题并不完全清楚,但下面的代码产生了两个图表,一个是每天的总数ClassWeekday另一个是Class每天每小时的总数。
我首先将列强制Class为类"integer",在您的输出中str(data)它是一个"factor".

library(tidyverse)
library(lubridate)

data$Class <- as.integer(as.character(data$Class))

data$Weekday <- format(data$Timestamp, "%a")
data$Hour <- hour(data$Timestamp)

现在是图表。首先是工作日。

aggregate(Class ~ Weekday, data, sum) %>%
  ggplot(aes(Weekday, Class)) +
  geom_col()

在此处输入图像描述

并按小时。

aggregate(Class ~ Hour, data, sum) %>%
  ggplot(aes(Hour, Class)) +
  geom_col()

在此处输入图像描述

编辑。

上面的图表也可以在不修改原始数据集的情况下生成data。它们将由更大的管道产生,但可能更简单或更可取,如下所示。
从原始数据开始。

data$Class <- as.integer(as.character(data$Class))

data %>%
  mutate(Weekday = format(Timestamp, "%a")) %>%
  group_by(Weekday) %>%
  summarise(Class = sum(Class)) %>%
  ggplot(aes(Weekday, Class)) +
  geom_col()

data %>%
  mutate(Hour = hour(Timestamp)) %>%
  group_by(Hour) %>%
  summarise(Class = sum(Class)) %>%
  ggplot(aes(Hour, Class)) +
  geom_col()

数据生成代码。

set.seed(1234)    # Make the results reproducible
n <- 1e3
start <- as.POSIXct("2018-01-01 00:00:00")
end <- Sys.time()
Timestamp <- sample(seq(start, end, by = "min"), n, TRUE)
Class <- factor(sample(0:1, n, TRUE))
data <- data.frame(Timestamp, Class)

推荐阅读