我有这个假设的数据框
df<- data.frame(a_13=c(NA, 1, 2),
a_12=c(NA, 0, 3),
a_11=c(0, 0,NA),
a_10=c(0, 8,10))
df
a_13 a_12 a_11 a_10
1 NA NA 0 0
2 1 0 0 8
3 2 3 NA 10
我想计算上述数据框中连续行之间的百分比变化。具体来说,我想用 3 个额外的列(I_13
、I_12
、I_11
)扩充上述数据框,其中这些新列的每一行都将来自相应行列(a_13
、a_12
、a_11
)元素的连续百分比变化,即
- I_13 结果来自 (a_13/a_12-1)*100%
- I_12 结果来自 (a_12/a_11-1)*100%
- I_11 结果来自 (a_11/a_10-1)*100%
对于百分比变化,必须满足以下条件
- 如果 a_{t}=NA 且 a_{t-1}=NA,则 (a_{t}/a_{t-1}-1)*100%=NA
- 如果 a_{t-1}=0 或 NA,则 (a_{t}/a_{t-1}-1)*100%="#"
- 如果 a_{t}=NA 且 a_{t-1}>0,则 a_{t}/a_{t-1}=0 且因此 (a_{t}/a_{t-1}-1)*100%=-100%
所以我的新数据框应该是
df_D
a_13 a_12 a_11 a_10 I_13 I_12 I_11
1 'NA 'NA' '0' '0' 'NA' '#' '#'
2 '1 '0' '0' '8' '#' '#' '-100%'
3 '2' '3' 'NA' '10' '-33.333%' '#' '-100%'
我尝试过类似
library(scales)
df[sub("^a", "I", names(df))] <- cbind( percent( unlist( (df[-ncol(df)] - df[-1])/df[-1] ) ) )
但它不起作用。
我的实际数据框包含数十万行,a_13
最多a_1
。因此,更通用的代码会有所帮助。
下面的方法应该有效:
act
,prev
分别代表实际值 和前一时期 。pivot_wider
结果以获得所需的格式。现在我们只需要使用
pivot_wider
: