r - 在 R 中将函数迭代应用到它自己的结果

标签 r dplyr tidyverse

我有一个如下所示的数据集:

dat <- structure(list(year = c(2003, 2004, 2005, 2006, 2007, 2008, 2009, 
2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017), CD = c(246.74, 
271.25, 295.21, 307.46, 405.82, 391.65, 439.1, 538.39, 549.27, 
559.94, 510.51, 516.14, 480.25, 472.18, 460.56), Growth = c(1.17, 
0.94, 1.05, 0.95, 1, 1.04, 1.09, 1.08, 1, 1.08, 0.97, 0.99, 1.06, 
0.99, 0.99)), .Names = c("year", "CD", "Growth"), class = "data.frame", row.names = c(NA, 
-15L))

看起来像

   year     CD    Growth
16 2003  246.74   1.17
17 2004  271.25   0.94
18 2005  295.21   1.05
19 2006  307.46   0.95
20 2007  405.82   1.00
21 2008  391.65   1.04
22 2009  439.10   1.09
23 2010  538.39   1.08
24 2011  549.27   1.00
25 2012  559.94   1.08
26 2013  510.51   0.97
27 2014  516.14   0.99
28 2015  480.25   1.06
29 2016  472.18   0.99
30 2017  460.56   0.99

我需要做的是创建一个新列,调用是KD,它采用以下值:

  1. 2007 年,CD

  2. 对于 2007 年之后的所有年份,前一年的 KD * 当年的增长

  3. 对于 2007 年之前的所有年份,次年的 KD/当年的增长

也就是说,以2007年为引用年,KD[year == 2007]应该是405.82KD[year == 2008] 应为 422.05 (405.82 * 1.04),KD[year == 2009] 应为 460.04 (422.05 * 1.09)

同时,KD[year == 2006] 应为 427.18 (405.82/0.95) 且 KD[year == 2005]406.84 (427.18/1.05)

在 R 中是否有一种简单的方法可以做到这一点,而无需使用繁琐的 for 循环?

最佳答案

dat%>%mutate(l=CD[year==2007])%>%
  group_by(s=cumsum(year==2007))%>%
  mutate(KD=ifelse(s==0,l/rev(cumprod(rev(Growth))),l*cumprod(Growth)),l=NULL)%>%
  data.frame()


   year     CD Growth s       KD
1  2003 246.74   1.17 0 369.9192
2  2004 271.25   0.94 0 432.8054
3  2005 295.21   1.05 0 406.8371
4  2006 307.46   0.95 0 427.1789
5  2007 405.82   1.00 1 405.8200
6  2008 391.65   1.04 1 422.0528
7  2009 439.10   1.09 1 460.0376
8  2010 538.39   1.08 1 496.8406
9  2011 549.27   1.00 1 496.8406
10 2012 559.94   1.08 1 536.5878
11 2013 510.51   0.97 1 520.4902
12 2014 516.14   0.99 1 515.2853
13 2015 480.25   1.06 1 546.2024
14 2016 472.18   0.99 1 540.7404
15 2017 460.56   0.99 1 535.3330

关于r - 在 R 中将函数迭代应用到它自己的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51140513/

相关文章:

json - 如何将数据框转换为自定义 json 格式

r - 在 R 中向数据框添加缺少的小时数

r - Dplyr 在指定位置改变新列

r - 按所有变量计数/计数与 dplyr 不同

r - 列表列数据框中的 purrr pmap

r - 在 r 中的 group_by 建模后取消嵌套列表列

r - 在 R 中反转数据帧

r - linux下无法安装Cairo包

r - 多边形仅在 leaflet() 中调用数据时显示

r - 在 R 中的 mutate 语句中调用 API