让我们假设以下DT:
library(data.table)
test <- data.table(n0 = c(550,575,550), age = list(c(5.2,6.2,7.2,8.2)), idx = c(16.63,16.39,16.22))
我需要做的是递归地使用现有列中的元素来计算新列,但是还没有能够找到它的方法。
新列必须计算为:
n1 = n0 * (age2/age1)^-0.1429 * exp((-0.029+0.00144*idx)*(age2-age1))
age1应为:5.2,6.2,7.2(即年龄[1:(长度(年龄)-1)])
age2应为:6.2,7.2,8.2(即年龄[2:长度(年龄)])
n0初始值为550,575和550但是对于下一个项目,n0应该被先前计算的n1替换。
所以,对于第一行,我期望获得的是:550,534,520,508。第二行:575,558,543,531。对于最后一行,预期结果与第一行相同。
我可以使用for循环获得结果。如果我能更有效地使用DT,我想知道的是什么。
答案 0 :(得分:0)
需要更清晰的图片来重建data.table但下面是我对您的数据的解释。已将公式重新解释为累积产品而非递归
library(data.table)
#will need a clearer picture to better re-construct the data.table
ages <- c(5.2,6.2,7.2,8.2)
test <- data.table(
id = rep(1L:3L, each=length(ages)),
n0 = rep(c(550,575,550), each=length(ages)),
age = rep(ages, 3),
idx = rep(c(16.63,16.39,16.22), each=length(ages)))
#create age1 by lagging age column
test[, age1:=shift(age, type="lag"), by="id"]
#calculate the term that is independent of prev recursion
test[, Val:=ifelse(is.na(age1), 1,
(age/age1)^-0.1429 * exp((-0.029+0.00144*idx)*(age-age1))),
by="id"]
#re-interpret the recursion as a cumulative product
test[, Result := n0 * cumprod(Val), by="id"]
test