在data.table中递归使用列元素

时间:2017-02-23 13:16:29

标签: r list recursion data.table

让我们假设以下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,我想知道的是什么。

1 个答案:

答案 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