【问题标题】:How to divide monthly totals by the seasonal monthly ratio in R如何将每月总计除以R中的季节性每月比率
【发布时间】:2019-01-30 16:35:29
【问题描述】:

我正在尝试通过将我的每月总数除以该月的平均季节性比率来对我的数据进行去季节性处理。我有两个数据框。 avgseasonality 具有每月 12 行的平均季节性比率。问题在于,季节性比率是每个月的平均比率只有 12 行,而 ordertotal 数据框有 147 行。

deseasonlize <- transform(avgseasonalityratio, deseasonlizedtotal = 
df1$OrderTotal / avgseasonality$seasonalityratio)

这会运行,但它没有正确配对月份。它使用 4 月的第一个比率,并在 12 月的第一个订单总计上运行它。

> avgseasonality
       Month seasonalityratio
1      April        1.0132557
2     August        1.0054602
3   December        0.8316988
4   February        0.9813396
5    January        0.8357475
6       July        1.1181648
7       June        1.0439899
8      March        1.1772450
9        May        1.0430667
10  November        0.9841149
11   October        0.9595041
12 September        0.8312318

> df1
# A tibble: 157 x 3
 DateEntLabel        OrderTotal `d$Month`
  <dttm>                   <dbl> <chr>    
 1 2005-12-01 00:00:00    512758. December 
 2 2006-01-01 00:00:00    227449. January  
 3 2006-02-01 00:00:00    155652. February 
 4 2006-03-01 00:00:00    172923. March    
 5 2006-04-01 00:00:00    183854. April    
 6 2006-05-01 00:00:00    239689. May      
 7 2006-06-01 00:00:00    237638. June     
 8 2006-07-01 00:00:00    538688. July     
 9 2006-08-01 00:00:00    197673. August   
10 2006-09-01 00:00:00    144534. September
# ... with 147 more rows

我分别需要每个月的 ordertotal 和 ratio。每个月的计算将分别为(12 月)512758/0.8316988 = 616518.864762 计算的输出将在与月份和 ordertotal 对应的新列中。非常感谢任何帮助!

【问题讨论】:

    标签: r


    【解决方案1】:

    最简单的方法是先merge()您的数据,然后进行操作。您可以使用 R base merge() 函数,但我将在此处使用 tidyverse left_join() 函数进行演示。我看到您的一个列有一个奇怪的名称 d$Month,将其重命名为 Month 将简化合并!

    可重现的例子:

    library(tidyverse)
    df_1 <-  data.frame(Month = c("Jan", "Feb"), seasonalityratio = c(1,2))
    df_2 <-  data.frame(Month = rep(c("Jan", "Feb"),each=2), OrderTotal = 1:4)
    
    
    df_1 %>% 
      left_join(df_2, by = "Month") %>% 
      mutate(eseasonlizedtotal = OrderTotal / seasonalityratio)
    #>   Month seasonalityratio OrderTotal eseasonlizedtotal
    #> 1   Jan                1          1               1.0
    #> 2   Jan                1          2               2.0
    #> 3   Feb                2          3               1.5
    #> 4   Feb                2          4               2.0
    

    reprex package (v0.2.1) 于 2019 年 1 月 30 日创建

    【讨论】:

    • 谢谢!我没想过这样做,但效果很好。感谢您的宝贵时间并了解了如何使用联接。我不知道我们可以像这样加入数据。
    • 很高兴能帮上忙!我看到这是第一次,您可以通过单击绿色标记以及使用向上箭头来接受满意的答案。欢迎来到论坛!
    • 我需要更多积分才能使用向上箭头。但我得到了绿色复选标记!
    猜你喜欢
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多