在R中,如何根据不同的列标准计算数据框中的y / y和w / w?

克里斯汀·施密特(Christian Schmidt)

我有很多数据框,其中的多个列包含日期,区域,产品和销售数量,涵盖不同的行业。这是我在说的一个简化示例

Year = c((rep(c(2015),5)),(rep(c(2015)+1,5)),(rep(c(2015)+2,5)))
Month = as.factor(c("JAN","FEB","MAR","APR","MAY"))
Week = as.factor(c(1,2,3,4,5))
product_type = as.factor(c("Yellow", "Green", "Red", "Blue", "Black"))
region = as.factor(c("North","North","North","South","South"))
Sales = c(1000,2000,3000,4000,5000,1500,2200,2800,4500,2000,3000,4000,5000,6000,5200)
df = data.frame(date,product_type,region,Sales)
df

   Year Month Week product_type region Sales
1  2015   JAN    1       Yellow  North  1000
2  2015   FEB    2        Green  North  2000
3  2015   MAR    3          Red  North  3000
4  2015   APR    4         Blue  South  4000
5  2015   MAY    5        Black  South  5000
6  2016   JAN    1       Yellow  North  1500
7  2016   FEB    2        Green  North  2200
8  2016   MAR    3          Red  North  2800
9  2016   APR    4         Blue  South  4500
10 2016   MAY    5        Black  South  2000
11 2017   JAN    1       Yellow  North  3000
12 2017   FEB    2        Green  North  4000
13 2017   MAR    3          Red  North  5000
14 2017   APR    4         Blue  South  6000
15 2017   MAY    5        Black  South  5200

我正在尝试为此数据计算y / y变化,并按product_type和region进行过滤。再一次,这是一个更加简单的版本,我拥有多年以来每种产品和地区的52周数据。结果应如下所示。

Year Month Week product_type region Sales y/y
2016   JAN    1       Yellow  North  1500 50.0%
2016   FEB    2        Green  North  2200 10.0%
2016   MAR    3          Red  North  2800 ---
2016   APR    4         Blue  South  4500 ---
2016   MAY    5        Black  South  2000
2017   JAN    1       Yellow  North  3000
2017   FEB    2        Green  North  4000
2017   MAR    3          Red  North  5000
2017   APR    4         Blue  South  6000
2017   MAY    5        Black  South  5200

我的问题是,不同的数据集具有不同的长度,可能一年缺少一些数据,或者名称完全不同。

到目前为止,我的解决方案是使用data.table和tidyverse库过滤出一个“ product_type”和一个“区域”,然后使用shift()计算一个日期与另一个日期的差。这就需要我创建新的数据框架,需要过滤的硬代码,这会使我的代码太长,以至于其他人都无法理解或检查。由于我的实际数据集具有数百万行的数据,因此该解决方案还需要我花费相当多的时间编写代码并在markdown中运行。

这是我正在处理的列的示例

 "Company","Date","Year","Month","Week","Region","Product Type","Company Sales Units",
 "Company Value USD","Company ASP","Total Sales Units","Total Value USD","Total ASP",
 "% Share Units","% Share USD","ASP difference"     

我想知道是否有一种方法可以执行计算,但是要求“ product_type”和“ region”值都相同,但是日期不同。能做到吗?如果没有,可以使用SQL或python完成吗?我在这两者上都有一些经验,但是非常生锈。

任何建议也将有所帮助,谢谢!

凝结

尝试这个:

df <- df %>%
  group_by(product_type, region) %>%
  mutate("y/y" = if_else(Year == (lag(Year) + 1), (Sales/lag(Sales)) - 1, NA_real_))%>%
  group_by(Year) %>%
  mutate(month_num = match(Month, toupper(month.abb))) %>%
  mutate("m/m" = if_else(month_num == lag(month_num) + 1, (Sales/lag(Sales)) - 1, NA_real_)) %>%
  mutate("w/w" = if_else(Week == (lag(Week) + 1), (Sales/lag(Sales)) - 1, NA_real_))

df

滞后会查看上一行,如果您按产品类型和地区进行分组,则会查看每个组的前一行。

例如,如果product_type和region为Yellow和North,则将2016年的销售数量除以2015年的销售数量(并减去1,因此是.5而不是1.5)。

如果跳过一年,if_else将会捕获,并且如果年份是连续的,则仅计算y / y%。使用if_else(与基础ifelse相反)要求true和false值是同一类型,因此使用NA_real_

逻辑可以理解为:如果当前组行日期等于前一行的日期+ 1(2016 == 2015 + 1),则计算y / y%,否则计算NA。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在R中以“ V,W,X,Y和Z”样式输出列表的简单方法

来自分类Dev

Ruby Rails%r和%w

来自分类Dev

fopen()中r +和w +之间的区别

来自分类Dev

.clearRect(x,y,w,h)的画布动画

来自分类Dev

.clearRect(x,y,w,h)的画布动画

来自分类Dev

w,who,whoami和id的不同输出

来自分类Dev

正文和W3标准中的<style>标签

来自分类Dev

perl魔术符号-w -r和_

来自分类Dev

bash中的“ x [y] =([z] = w)”是什么意思?

来自分类Dev

在Vim中,ctrl + w ctrl + w是相反的?

来自分类Dev

您如何将:w映射到:w!和:q到:q!在我的vimrc中?

来自分类Dev

运行多个线程的JVM如何处理ctrl-c,w / w和w / o shutdown钩子?

来自分类Dev

在PHP fopen函数中,w和w +模式有什么区别?

来自分类Dev

朱莉娅通量中的Keras W_constraint和W_regularizer类似物

来自分类Dev

使用RSA算法字母'w','x','y','z'进行加密

来自分类Dev

识别与.DrawImage(img,x,y,w,h)的碰撞

来自分类Dev

ping -W如何工作

来自分类Dev

CentOS 8 Docker容器中的who和w命令

来自分类Dev

为什么/ \ w +:/和/ \ S +:/处理回溯的方式不同?

来自分类Dev

如何用clang和mingw-w64进行编译?

来自分类Dev

w命令如何知道空闲时间和运行命令?

来自分类Dev

Ruby%w(...)与%w [...]

来自分类Dev

Rapidminer中的W-apriori

来自分类Dev

查找满足w + x = y + j的(x,y,z,j)的所有组合的算法,其中w,x,y,j是-N ... N(含)之间的整数

来自分类Dev

train.default(x,y,weights = w,...)中的错误:无法确定最终调整参数

来自分类Dev

使Readers / Writer线程进入R / W / R / W

来自分类Dev

SQL查询:如果x = 1则y <z选择所有位置,如果x = 2则y <w

来自分类Dev

如何将vim命令:W永久映射到:w?

来自分类Dev

如何用w {3}替换模式w {3,3}

Related 相关文章

  1. 1

    在R中以“ V,W,X,Y和Z”样式输出列表的简单方法

  2. 2

    Ruby Rails%r和%w

  3. 3

    fopen()中r +和w +之间的区别

  4. 4

    .clearRect(x,y,w,h)的画布动画

  5. 5

    .clearRect(x,y,w,h)的画布动画

  6. 6

    w,who,whoami和id的不同输出

  7. 7

    正文和W3标准中的<style>标签

  8. 8

    perl魔术符号-w -r和_

  9. 9

    bash中的“ x [y] =([z] = w)”是什么意思?

  10. 10

    在Vim中,ctrl + w ctrl + w是相反的?

  11. 11

    您如何将:w映射到:w!和:q到:q!在我的vimrc中?

  12. 12

    运行多个线程的JVM如何处理ctrl-c,w / w和w / o shutdown钩子?

  13. 13

    在PHP fopen函数中,w和w +模式有什么区别?

  14. 14

    朱莉娅通量中的Keras W_constraint和W_regularizer类似物

  15. 15

    使用RSA算法字母'w','x','y','z'进行加密

  16. 16

    识别与.DrawImage(img,x,y,w,h)的碰撞

  17. 17

    ping -W如何工作

  18. 18

    CentOS 8 Docker容器中的who和w命令

  19. 19

    为什么/ \ w +:/和/ \ S +:/处理回溯的方式不同?

  20. 20

    如何用clang和mingw-w64进行编译?

  21. 21

    w命令如何知道空闲时间和运行命令?

  22. 22

    Ruby%w(...)与%w [...]

  23. 23

    Rapidminer中的W-apriori

  24. 24

    查找满足w + x = y + j的(x,y,z,j)的所有组合的算法,其中w,x,y,j是-N ... N(含)之间的整数

  25. 25

    train.default(x,y,weights = w,...)中的错误:无法确定最终调整参数

  26. 26

    使Readers / Writer线程进入R / W / R / W

  27. 27

    SQL查询:如果x = 1则y <z选择所有位置,如果x = 2则y <w

  28. 28

    如何将vim命令:W永久映射到:w?

  29. 29

    如何用w {3}替换模式w {3,3}

热门标签

归档