r - 迭代计算 - 矢量化
问题描述
我试图找到一种方法如何在 R 中实现一个相当简单的东西。我有一个可以按多个变量分组的输入表。基本上,我想要的是根据这个方程计算一列
y[n+1] = ( 1 + a[n] ) * y[n] + b[n]
列a
和b
是已知的,初始y[1]
. 我试图做这样的事情
table %>% mutate(y = cumsum(y + lag(y*a + b,default = 0)))
(y、a、b 是表中的列)但它不起作用 - 主要问题是 y 和 a 列之间的乘法。我试图让它与reduce
函数一起工作,但因为我需要两列(a,b)作为计算参数,所以它不起作用。我想将此代码包含在管道中。否则,我将设置一个 for 循环以使其正常工作,但我认为必须有一种方法可以以一种不错的矢量化方式执行此类操作。
谢谢。
解决方案
鉴于:
y[n+1] = ( 1 + a[n] ) * y[n] + b[n]
table %>%
mutate(y = (1 + lag(a)) * lag(y) + lag(b))
或更明确地只是为了更加确定操作顺序
table %>%
mutate(y = ((1 + lag(a)) * lag(y)) + lag(b))
请注意,第一个值将是 NA,因为 (1 + NA) * NA + NA = NA
使用 y[n] 覆盖 y[n+1] 应该没有任何问题,但万一你有 y 问题,你可以这样做:
table %>%
mutate(y1 = (1 + lag(a)) * lag(y) + lag(b))
更新
我注意到我可能误解了可用的输入信息。如果只有 y 的第一个值可用,则需要使用不同的方法。不可能使用滞后,因为我们没有预先填充的向量(所有初始 y 值都可用)。然后我们只需要做一个“快速”循环。
# If you only have y[1] and no other Y then you can't really do this as a
# vector operation because there is no complete initial vector.
# Use a fast loop by declaring memory one time only before the loop
table$y <- NA_real_ # initialize all the memory for y column at one time
table$y[1] <- init_y_val # set the initial value of y
for(idx in 2:nrow(table)){
table$y[idx] <- ((1 + a[idx - 1]) * y[idx -1]) + b[idx -1]
}
推荐阅读
- ios - 无法在我的 TableView 中显示自定义单元格文件?
- java - 处理公共/中心对象的最佳方式
- java - 如何将对象存储在另一个类中的一个类的数组列表中
- javascript - 如何防止 JavaScript 因多次单击按钮而滞后?
- swift - SWIFT Firestore 使用查询获取数据以过滤 whereField is equalTo a autoID 失败
- css - 在网格容器内保持 100vh 溢出的问题
- kubernetes - Ingress Nginx 在服务器代码段中使用正则表达式
- c# - 服务器端google授权
- ubuntu - VS Code 代码命令在 Pop OS 的终端上不再工作
- ms-access - 计算列突然生成错误,“您输入的设置对此属性无效。”