我有一个如下所示的数据集:
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
,它采用以下值:
2007 年,
CD
对于 2007 年之后的所有年份,
前一年的 KD * 当年的增长
对于 2007 年之前的所有年份,
次年的 KD/当年的增长
也就是说,以2007年为引用年,KD[year == 2007]
应该是405.82,KD[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/