【发布时间】:2018-08-16 15:54:00
【问题描述】:
我在数据框中有一些数据,我想计算month 值之间的百分比变化。问题是我在某些条目中有NA,它会引发计算。
irm code price pct.change
1 201807 511130F075A04 4.6600 2.192982
2 201806 511130F075A04 4.5600 1.333333
3 201805 511130F075A04 4.5000 -13.461538
4 201804 511130F075A04 5.2000 NA
5 201803 511130F075A04 NA NA
6 201802 511130F075A04 4.9100 1.867220
7 201801 511130F075A04 4.8200 -5.304519
8 201712 511130F075A04 5.0900 2.414487
9 201711 511130F075A04 4.9700 -3.307393
10 201710 511130F075A04 5.1400 NA
11 201709 511130F075A04 NA NA
12 201708 511130F075A04 5.2900 2.918288
13 201707 511130F075A04 5.1400 66.553255
14 201706 511130F075A04 3.0861 -10.664351
15 201705 511130F075A04 3.4545 -7.241824
问题出在pct.change 列的第 4 行和第 10 行。它们是NA,但我希望使用price 的最新值而不是NA 来计算它们。所需的输出将是(见第 4 行和第 10 行):
irm code price pct.change
1 201807 511130F075A04 4.6600 2.192982
2 201806 511130F075A04 4.5600 1.333333
3 201805 511130F075A04 4.5000 -13.461538
**4 201804 511130F075A04 5.2000 5.906314**
5 201803 511130F075A04 NA NA
6 201802 511130F075A04 4.9100 1.867220
7 201801 511130F075A04 4.8200 -5.304519
8 201712 511130F075A04 5.0900 2.414487
9 201711 511130F075A04 4.9700 -3.307393
**10 201710 511130F075A04 5.1400 -2.835539**
11 201709 511130F075A04 NA NA
12 201708 511130F075A04 5.2900 2.918288
13 201707 511130F075A04 5.1400 66.553255
14 201706 511130F075A04 3.0861 -10.664351
15 201705 511130F075A04 3.4545 -7.241824
我尝试了标准的(x/lead(x) - 1)*100 和使用(x/lag(which(!is.na(lead(x)) 的几个变体,但我似乎遗漏了一些东西。在base 甚至dplyr 中是否有直接的方法? 我不想更换 NA,我想保留它们。
【问题讨论】:
-
df$pct.change[!is.na(df$price)] <- with(df[!is.na(df$price),], (price/dplyr::lead(price) - 1) * 100) -
我喜欢这个,但是当我在完整的
data.frame上使用它时,我收到以下警告:number of items to replace is not a multiple of replacement length。不过,它在示例中确实工作得很好。