创造;“每天”;行,来自“选择性”;每月“;使用tidyverse的图形

创造;“每天”;行,来自“选择性”;每月“;使用tidyverse的图形,r,tidyverse,R,Tidyverse,我有一套销售报告,其中包含报告“每天”或“每月”销售数字的商店。 当我把它们画在同一张图上时,“每月”的数字看起来像尖峰,这使得图很难理解 我希望将这些“每月一次”的数字转换为平均分布在一个月内的几天内,这样我就可以绘制每日销售图 我设法使用tidyverse,lubridate计算数据集中的“每日销售额”列。如何创建“每天1行”的行,即2019-01年,从每1行月度数据创建30行每日行 sales <- tibble( distributor = c("StoreA", "Store

我有一套销售报告,其中包含报告“每天”或“每月”销售数字的商店。 当我把它们画在同一张图上时,“每月”的数字看起来像尖峰,这使得图很难理解

我希望将这些“每月一次”的数字转换为平均分布在一个月内的几天内,这样我就可以绘制每日销售图

我设法使用tidyverse,lubridate计算数据集中的“每日销售额”列。如何创建“每天1行”的行,即2019-01年,从每1行月度数据创建30行每日行

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!!