Я бы переименовал / изменил форму ...
myDT = melt(DT, id = "year", meas=list(2,3),
variable.name = "food",
value.name = c("value", "xRatio"))[, food := "c_Crust"][]
# or for this example with only one food...
myDT = DT[, .(year, food = "c_Crust", xRatio = xRatio.c_Crust, value = c_Crust)]
... затем сделал бы расчет для группы продуктов с данными в полной форме:
myDT[, v := replace(first(value)*cumprod(replace(xRatio, 1, 1)), 1, NA), by=food]
# or more readably, to me anyways
library(magrittr)
myDT[, v := first(value)*cumprod(xRatio %>% replace(1, 1)) %>% replace(1, NA), by=food]
Альтернативно, естьmyDT[, v := c(NA, first(value)*cumprod(xRatio[-1])), by=food]
, расширяя код OP, хотя я предпочитаю просто работать с полноразмерными векторами с заменой, а не пытаться строить векторы с c
, так как последний может столкнуться со странными крайними случаями (например, если есть только одна строка,это будет делать правильно?).