【问题标题】:Calculating percent change between current value and value of a year ago R计算当前值与一年前值之间的百分比变化 R
【发布时间】:2021-11-30 07:25:16
【问题描述】:

这是我的数据框示例:

A = data.frame(retailer = c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),
store = c(5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6), 
week = c(2021100301, 2021092601, 2021091901, 2021091201, 2021082901, 2021082201, 2021081501, 2021080801,
          2020100101, 2020092501, 2020091801, 2020091101, 2020090401, 2020082701, 2020082001, 2020081301),
dollars = c(121817.9, 367566.7, 507674.5, 421257.8, 453330.3, 607551.4, 462674.8,
  464329.1, 339342.3, 549271.5, 496720.1, 554858.7, 382675.5,
  373210.9, 422534.2, 381668.6),
final_week = c("20211040", "20211039", "20211038", "20211037", "20210935", "20210934", "20210933", "20210832", 
          "20201040", "20201039", "20201038", "20201037", "20200935", "20200934", "20200933", "20200832"),
fill = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1))

我先按零售商、然后按商店、然后按每个组中的 final_week 值降序对这些进行分组。如何在每个商店分组中找到最近 4 个 final_week 值与其对应的一年前 final_week 值之间的美元百分比差异?例如,final_week 列中的第一个值是 20211040,它指的是 2021 年。一年前的值是 20201040(2020 年)。我想找到这些值之间的百分比差异,对最近的四个 final_week 值(每个商店组的前四个,因为我按降序排列它们)。

我已开始执行以下操作:

A = A %>%
group_by(retailer, store) %>%
arrange(arrange(retailer, store, desc(final_week), by_group = TRUE) %>%

但我不确定从这里去哪里。谢谢!

【问题讨论】:

    标签: r grouping percentage


    【解决方案1】:

    我稍微修改了您的示例数据以获得一些有用的结果(一个商店,两年),这里是tidyverse 解决方案:

    library(dyplr)
    library(tidyr)
    
    A %>%
      # add week and year
      mutate(year_ = substr(final_week, 1,4),
             week_ = substr(final_week,5,8)) %>%
      # remove useless columns
      select(-final_week,- week) %>%
      # from long to wide, with columns for years
      pivot_wider(names_from = year_,
                  values_from = c(dollars)) %>%
       # get the last 4 weeks both years
       top_n(wt = week_,4) %>%
       # percentage
       mutate(perc = (`2021`- `2020`)/ `2020`*100)
    
    # A tibble: 4 x 7
      retailer store  fill week_  `2021`  `2020`   perc
         <dbl> <dbl> <dbl> <chr>   <dbl>   <dbl>  <dbl>
    1        2     5     1 1040  121818. 339342. -64.1 
    2        2     5     1 1039  367567. 549272. -33.1 
    3        2     5     1 1038  507674. 496720.   2.21
    4        2     5     1 1037  421258. 554859. -24.1 
    

    编辑:

    这里有一个多年的解决方案,可能会有所不同:

    A %>%
      mutate(year_ = ifelse(substr(final_week,1,4) == min(substr(final_week,1,4)), 'first_y', 'second_y'),
             week_ = substr(final_week,5,8)) %>%
      select(-final_week,- week) %>%
      pivot_wider(names_from = year_,
                  values_from = c(dollars)) %>%
       top_n(wt = week_,4) %>%
       mutate(perc = (second_y - first_y)/ first_y*100)
    
      # A tibble: 4 x 7
      retailer store  fill week_ second_y first_y   perc
         <dbl> <dbl> <dbl> <chr>    <dbl>   <dbl>  <dbl>
    1        2     5     1 1040   121818. 339342. -64.1 
    2        2     5     1 1039   367567. 549272. -33.1 
    3        2     5     1 1038   507674. 496720.   2.21
    4        2     5     1 1037   421258. 554859. -24.1 
    

    有数据

    A <- data.frame(retailer = c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),
                   store = rep(5,16), 
                   week = c(2021100301, 2021092601, 2021091901, 2021091201, 2021082901, 2021082201, 2021081501, 2021080801,
                            2020100101, 2020092501, 2020091801, 2020091101, 2020090401, 2020082701, 2020082001, 2020081301),
                   dollars = c(121817.9, 367566.7, 507674.5, 421257.8, 453330.3, 607551.4, 462674.8,
                               464329.1, 339342.3, 549271.5, 496720.1, 554858.7, 382675.5,
                               373210.9, 422534.2, 381668.6),
                   final_week = c("20211040", "20211039", "20211038", "20211037", "20210935", "20210934", "20210933", "20210832", 
                                  "20201040", "20201039", "20201038", "20201037", "20200935", "20200934", "20200933", "20200832"),
                   fill = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1))
    

    【讨论】:

    • 嗨,我看到您已将 2021 年和 2020 年直接放入解决方案中(在最后一个 mutate 行中)。我的数据每周都会刷新一次,所以最终会达到 2022 年等等,所以我将无法使用硬编码的年份。有没有另一种方法可以找到最近一年和一年前之间的差异? (除非我误会了)
    • 嗨,你没有误会。我认为一个解决方案可能会以不同于几年的方式进行,并定义以前的和当前的,总是变得越来越小。见编辑。
    猜你喜欢
    • 2018-06-29
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多