如何计算行之间的差异并将差异除以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
函数来计算差值,但我不知道如何将该差值除以前几行的值。
我们可以将 across
与 lag
一起使用 - 循环 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 R
和 diff
df1[paste0(names(df1), "_r")] <- rbind(NA,
diff(as.matrix(df1)))/rbind(NA, df1[-nrow(df1),])
假设我有以下数据框:
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
函数来计算差值,但我不知道如何将该差值除以前几行的值。
我们可以将 across
与 lag
一起使用 - 循环 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 R
和 diff
df1[paste0(names(df1), "_r")] <- rbind(NA,
diff(as.matrix(df1)))/rbind(NA, df1[-nrow(df1),])