【发布时间】:2021-08-26 18:46:53
【问题描述】:
如何在 R 中对涉及使用 Z 的滞后值递归修改列 Z 的以下操作进行矢量化?
library(dplyr)
set.seed(5)
initial_Z=1000
df <- data.frame(X=round(100*runif(10),0), Y=round(100*runif(10),0))
df
X Y
1 20 27
2 69 49
3 92 32
4 28 56
5 10 26
6 70 20
7 53 39
8 81 89
9 96 55
10 11 84
df <- df %>% mutate(Z=if_else(row_number()==1, initial_Z-Y, NA_real_))
df
X Y Z
1 20 27 973
2 69 49 NA
3 92 32 NA
4 28 56 NA
5 10 26 NA
6 70 20 NA
7 53 39 NA
8 81 89 NA
9 96 55 NA
10 11 84 NA
for (i in 2:nrow(df)) {
df$Z[i] <- (df$Z[i-1]*df$X[i-1]/df$X[i])-df$Y[i]
}
df
X Y Z
1 20 27 973.000000
2 69 49 233.028986
3 92 32 142.771739
4 28 56 413.107143
5 10 26 1130.700000
6 70 20 141.528571
7 53 39 147.924528
8 81 89 7.790123
9 96 55 -48.427083
10 11 84 -506.636364
因此首先设置 Z 的第一个值,基于 initial_Z 和 Y 的第一个值。Z 的其余值使用 X 和 Z 的滞后值以及 Y 的当前值计算。
我的实际df很大,我需要在模拟中重复这个操作数千次。使用 for 循环需要太多时间。我更喜欢使用 dplyr 来实现这一点,但也欢迎使用其他方法。
非常感谢您的任何帮助。
【问题讨论】:
标签: r dataframe for-loop dplyr vectorization