如何计算行之间的差异并将差异除以R中上一行的值?

How to calculate the difference between rows and divide the difference with the value from the previous row in R?

假设我有以下数据框:

    A    B    C
1  15   14   12
2   7    1    6
3   8   22    5
4  11    5    1
5   4   12    4

我想计算行之间的差异,然后将差异除以前一行的值。这是为每个变量完成的。

结果会是这样的:

    A    B    C     A_r     B_r      C_r
1  15   14   12      NA      NA       NA
2   7    1    6   -0.53   -0.93    -0.50
3   8   22    5    0.14      21    -0.16
4  11    5    1     ...     ...      ...
5   4   12    4     ...     ...      ...

一般公式为:

R(n) = [S(n) - S(n-1)] / S(n-1)

其中 R 代表新计算的变量,S 代表当前变量,正在为(本例中的 A、B、C)计算值 R。

我知道我可以使用 diff 函数来计算差值,但我不知道如何将该差值除以前几行的值。

我们可以将 acrosslag 一起使用 - 循环 across 所有列 (everything()),应用公式,并通过修改 .names - 即添加后缀 _r 和相应的列名 ({.col})

library(dplyr)
df1 <- df1 %>%
   mutate(across(everything(),  ~ (. - lag(.))/lag(.),
   .names = "{.col}_r"))

-输出

df1
   A  B  C        A_r        B_r        C_r
1 15 14 12         NA         NA         NA
2  7  1  6 -0.5333333 -0.9285714 -0.5000000
3  8 22  5  0.1428571 21.0000000 -0.1666667
4 11  5  1  0.3750000 -0.7727273 -0.8000000
5  4 12  4 -0.6363636  1.4000000  3.0000000

或使用 base Rdiff

df1[paste0(names(df1), "_r")] <- rbind(NA, 
       diff(as.matrix(df1)))/rbind(NA, df1[-nrow(df1),])