【发布时间】:2018-07-03 22:10:25
【问题描述】:
我有一个如下所示的数据集:
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 of the year before * Growth of the current year对于 2007 年之前的所有年份,
KD of the following year / Growth of the current year
换句话说,2007 年作为参考年,KD[year == 2007] 应该是 405.82,KD[year == 2008] 应该是 422.05 (405.82 * 1.04) 和 @987654330 @ 应该是 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 循环的情况下做到这一点?
【问题讨论】:
-
在 cumprod、ifelse 和一些数学的帮助下,您可以在没有 for 循环的情况下做到这一点。