我会重命名/重塑。。。
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的代码,尽管我更喜欢用replace操作全长向量,而不是用
c
,因为后者可能会遇到奇怪的边缘情况(例如,如果只有一行,它会做正确的事情吗?)。