我想找到更快的解决方案来迭代地定义变量,即变量的下一行取决于前一行。例如,假设我有以下data.table:在r中的数据表中迭代地定义变量
tmp <- data.table(type = c("A", "A", "A", "B", "B", "B"),
year = c(2011, 2012, 2013, 2011, 2012, 2013),
alpha = c(1,1,1,2,2,2),
beta = c(3,3,3,4,4,4),
pred = c(1,NA,NA,2,NA, NA))
对于每种类型(A,然后B),我要解决的预解码向前发展,其中预解码A型2012年是:
pred_2012_A = alpha + beta * pred_2011_A
和预解码2013年A型继续:
pred_2013_A = alpha + beta * pred_2012_A
我使用for循环要经历类型,并创建一个变量来存储以前的值,并使用“通过”的解决方案命令在数据表中遍历年为这样:
for(i in c("A", "B")){
tmp.val <- tmp[type == i & year == 2011]$pred # initial value for type i
tmp[year > 2011 & type == i, pred := {
tmp.val <- alpha + beta * tmp.val
}, by = year]
}
最终,原始数据表的样子:
type year alpha beta pred
1: A 2011 1 3 1
2: A 2012 1 3 NA
3: A 2013 1 3 NA
4: B 2011 2 4 2
5: B 2012 2 4 NA
6: B 2013 2 4 NA
和更新的表如下所示:
type year alpha beta pred
1: A 2011 1 3 1
2: A 2012 1 3 4
3: A 2013 1 3 13
4: B 2011 2 4 2
5: B 2012 2 4 10
6: B 2013 2 4 42
这里我的问题是,如果有在没有for循环的情况下实现这个更快的方法。有没有一种方法可以在比使用for循环更快的数据表语句中实现此例程?我真正的用法有更多的类型和更多的年份来计算,所以更快的实现将不胜感激。
谢谢。
谢谢您的解决方案弗兰克。但是,我似乎让这个例子太简单了。如果预测值根据初始值没有一个很好的封闭形式解决方案会怎样?最终,我试图看看在计算pred的下一个值时访问pred的前一个值的最快方法,而不将其存储在临时变量中并使用for循环。我认为这可能是这种情况,如果alpha和beta每年都会发生变化。这有意义吗? – naveendaftari
如果你的解决方案必须迭代,除了循环之外,没有办法(在R或任何语言中,我猜)。这样的for循环在R中可能会很慢,但是可以将它翻译成C++并使用Rcpp库,这可能会有很大的帮助。 – Frank