至少有几个Q / As与此类似,但我似乎无法掌握它。这是一个可重复的例子。 DT保存数据。我想要食物(n)=食物(n-1)* xRatio.food(n)
DT <- fread("year c_Crust xRatio.c_Crust
X2005 0.01504110 NA
X2010 NA 0.9883415
X2015 NA 1.0685221
X2020 NA 1.0664189
X2025 NA 1.0348418
X2030 NA 1.0370386
X2035 NA 1.0333771
X2040 NA 1.0165511
X2045 NA 1.0010563
X2050 NA 1.0056368")
最接近公式的代码是
DT[,res := food[1] * cumprod(xRatio.food[-1])]
但res值向上移动,第一个值被回收到最后一行并带有警告。我希望xRatio.food的第一个值为NA
答案 0 :(得分:1)
我重命名/重塑......
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
构建向量来操作全长向量,因为后者可能遇到奇怪的边缘情况(如果只有一行,它会做正确的事吗?)。