创造;“每天”;行,来自“选择性”;每月“;使用tidyverse的图形
我有一套销售报告,其中包含报告“每天”或“每月”销售数字的商店。 当我把它们画在同一张图上时,“每月”的数字看起来像尖峰,这使得图很难理解 我希望将这些“每月一次”的数字转换为平均分布在一个月内的几天内,这样我就可以绘制每日销售图 我设法使用tidyverse,lubridate计算数据集中的“每日销售额”列。如何创建“每天1行”的行,即2019-01年,从每1行月度数据创建30行每日行创造;“每天”;行,来自“选择性”;每月“;使用tidyverse的图形,r,tidyverse,R,Tidyverse,我有一套销售报告,其中包含报告“每天”或“每月”销售数字的商店。 当我把它们画在同一张图上时,“每月”的数字看起来像尖峰,这使得图很难理解 我希望将这些“每月一次”的数字转换为平均分布在一个月内的几天内,这样我就可以绘制每日销售图 我设法使用tidyverse,lubridate计算数据集中的“每日销售额”列。如何创建“每天1行”的行,即2019-01年,从每1行月度数据创建30行每日行 sales <- tibble( distributor = c("StoreA", "Store
sales <- tibble(
distributor = c("StoreA", "StoreA", "StoreA", "StoreA", "StoreB"),
sales = c(100,200,300,400,5000),
date = c("2019-01-01", "2019-01-02", "2019-01-03", "2019-01-04", "2019-01-30"),
freq = c("daily", "daily", "daily", "daily", "monthly"))
> sales
# A tibble: 5 x 4
distributor sales date freq
<chr> <dbl> <chr> <chr>
1 StoreA 100 2019-01-01 daily
2 StoreA 200 2019-01-02 daily
3 StoreA 300 2019-01-03 daily
4 StoreA 400 2019-01-04 daily
5 StoreB 5000 2019-01-30 monthly
wanted_sales <- tibble(
distributor = c("StoreA", "StoreA", "StoreA", "StoreA", "StoreB", "StoreB", "StoreB", "StoreB"),
sales = c(100, 200, 300, 400, 5000 / 30, 5000 / 30, 5000 / 30, 5000 / 30),
date = c("2019-01-01", "2019-01-02", "2019-01-03", "2019-01-04", "2019-01-01", "2019-01-02", "2019-01-03", "2019-01-04"),
freq = c("daily", "daily", "daily", "daily", "daily", "daily", "daily", "daily" ))
> wanted_sales
# A tibble: 8 x 4
distributor sales date freq
<chr> <dbl> <chr> <chr>
1 StoreA 100 2019-01-01 daily
2 StoreA 200 2019-01-02 daily
3 StoreA 300 2019-01-03 daily
4 StoreA 400 2019-01-04 daily
5 StoreB 167. 2019-01-01 daily
6 StoreB 167. 2019-01-02 daily
7 StoreB 167. 2019-01-03 daily
8 StoreB 167. 2019-01-04 daily
per_day <- sales %>% filter(freq == "monthly") %>%
group_by(date) %>%
mutate(mdays = as.integer(days_in_month(as_date(date)))) %>%
mutate(sales_per_day = sales / mdays)
> per_day
# A tibble: 1 x 6
# Groups: date [1]
distributor sales date freq mdays sales_per_day
<chr> <dbl> <chr> <chr> <int> <dbl>
1 StoreB 5000 2019-01-30 monthly 31 161.
销售
#一个tibble:5x4
经销商销售日期频率
1 StoreA 100 2019-01-01每日
2 StoreA 200 2019-01-02每日
3 StoreA 300 2019-01-03每日
4 StoreA 400 2019-01-04每日
5库房5000 2019-01-30月
通缉销售通缉销售
#一个tibble:8x4
经销商销售日期频率
1 StoreA 100 2019-01-01每日
2 StoreA 200 2019-01-02每日
3 StoreA 300 2019-01-03每日
4 StoreA 400 2019-01-04每日
5.b 167。2019-01-01每日
6.b 167。2019-01-02每日
7.b 167。2019-01-03每日
8 b 167。2019-01-04每日
每日百分比过滤器(频率=“每月”)%>%
分组单位(日期)%>%
变异(mdays=as.integer(月内天数(日期)))%>%
变化(每天销售额=销售额/天数)
>每天
#一个tibble:1 x 6
#分组:日期[1]
经销商销售日期频率每天销售天数
1 StoreB 5000 2019-01-30每月31 161。
我希望生成的每_天TIBLE,有30行,$date列是“2019-01-01”、“2019-01-02”的序列。。。“2019-01-30”。我们可以将
日期
更改为实际日期类,并创建一个新列startdate
,如果freq
不是“daily”
并且sales
除以30,则该列将具有该特定月份的第一天。对于每个日期
,我们使用complete
创建日期序列,并将所有日期的freq
更改为“每日”
library(dplyr)
library(tidyr)
library(lubridate)
sales %>%
mutate(date = as.Date(date),
startdate = if_else(freq == "daily", date, floor_date(date, "month")),
sales = if_else(freq == "daily", sales, sales/30)) %>%
group_by(date) %>%
complete(date = seq(startdate, date, "1 day"), sales = sales,
freq = "daily", distributor = distributor) %>%
select(-startdate)
# Groups: date [30]
# date sales freq distributor
# <date> <dbl> <chr> <chr>
# 1 2019-01-01 100 daily StoreA
# 2 2019-01-02 200 daily StoreA
# 3 2019-01-03 300 daily StoreA
# 4 2019-01-04 400 daily StoreA
# 5 2019-01-01 167. daily StoreB
# 6 2019-01-02 167. daily StoreB
# 7 2019-01-03 167. daily StoreB
# 8 2019-01-04 167. daily StoreB
# 9 2019-01-05 167. daily StoreB
#10 2019-01-06 167. daily StoreB
# … with 25 more rows
库(dplyr)
图书馆(tidyr)
图书馆(lubridate)
销售额%>%
变异(日期=as.date(日期),
startdate=如果有其他情况(频率=“每日”,日期,楼层日期(日期,月)),
销售=如果其他(频率=“每日”,销售,销售/30))%>%
分组单位(日期)%>%
完成(日期=序号(起始日期,日期,“1天”),销售额=销售额,
freq=“daily”,分销商=分销商)%>%
选择(-startdate)
#分组:日期[30]
#日期销售频率经销商
#
#1 2019-01-01 100每日仓库a
#2 2019-01-02 200每日仓库a
#3 2019-01-03 300每日仓库a
#4 2019-01-04 400每日仓库a
# 5 2019-01-01 167. 每日仓库
# 6 2019-01-02 167. 每日仓库
# 7 2019-01-03 167. 每日仓库
# 8 2019-01-04 167. 每日仓库
# 9 2019-01-05 167. 每日仓库
#10 2019-01-06 167. 每日仓库
#…还有25行
太棒了!!!从不知道complete(),多么聪明的函数!在我绝望的尝试中,我是这样做的:R month\u days%mutate(ymon=floor\u date(date,unit=“month”)
这创建了一个包含日期列表的TIBLE,其中包含一个年份值,然后我可以留下来加入。它确实有效,但您的解决方案要好得多!谢谢你给我展示了一种非常优雅的方式,Ronak!!