简体   繁体   English

如何捕获 R 中的百分比变化

[英]How to capture percent change in R

I really need your help, any support will be much appreciated.我真的需要你的帮助,任何支持将不胜感激。

This is the example data:这是示例数据:

tibble::tribble(
    ~Item, ~Amount,        ~Date,
    "saw",     10L, "01/01/2020",
    "saw",     20L, "04/01/2020",
    "saw",      5L, "03/06/2020",
    "saw",     30L, "02/07/2020",
  "nails",    300L, "02/02/2020",
  "nails",    200L, "04/03/2020",
  "nails",    250L, "05/03/2020",
  "nails",    400L, "10/05/2020"
  )

I am trying to create a new column next to date that captures the percent change in amount for each item from one date to the next.我正在尝试在 date 旁边创建一个新列,该列捕获每个项目从一个日期到下一个日期的百分比变化。

The result would look like:结果将如下所示:

tibble::tribble(
    ~Item, ~Amount,        ~Date, ~`%.change`,
    "saw",     10L, "01/01/2020",        "0%",
    "saw",     20L, "04/01/2020",      "100%",
    "saw",      5L, "03/06/2020",      "-75%",
    "saw",     30L, "02/07/2020",      "500%",
  "nails",    300L, "02/02/2020",        "0%",
  "nails",    200L, "04/03/2020",      "-33%",
  "nails",    250L, "05/03/2020",       "25%",
  "nails",    400L, "10/05/2020",       "60%"
  )

The formula for percent change: (new observation- original observation)/original observation * 100百分比变化的公式:(新观测值-原始观测值)/原始观测值 * 100

And for the first date for each item, when there still hasn't been any change value of 0 or empty cell.对于每个项目的第一个日期,当仍然没有任何更改值 0 或空单元格时。

Again any help will be much appreciated, and huge thanks in advance!!再次任何帮助将不胜感激,并在此先感谢!

You can group by the Item column then, to get the "original observation" for your calculation, use dplyr::lag .然后,您可以按Item列分组,以获得计算的“原始观察”,使用dplyr::lag This will make the first item in each group NA , so use an ifelse to change it to 0%.这将使每个组中的第一项成为NA ,因此使用ifelse将其更改为 0%。

library(dplyr)

df %>%
  group_by(Item) %>%
  mutate(`%.change` = scales::percent((Amount - lag(Amount))/lag(Amount)),
         `%.change` = ifelse(is.na(`%.change`), "0%", `%.change`))
#> # A tibble: 8 x 4
#> # Groups:   Item [2]
#>   Item  Amount Date       `%.change`
#>   <chr>  <int> <chr>      <chr>     
#> 1 saw       10 01/01/2020 0%        
#> 2 saw       20 04/01/2020 100%      
#> 3 saw        5 03/06/2020 -75%      
#> 4 saw       30 02/07/2020 500%      
#> 5 nails    300 02/02/2020 0%        
#> 6 nails    200 04/03/2020 -33%      
#> 7 nails    250 05/03/2020 25%       
#> 8 nails    400 10/05/2020 60% 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM