再次对数据表进行r rowdies迭代

时间:2018-04-25 23:46:55

标签: r data.table iteration

至少有几个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

1 个答案:

答案 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构建向量来操作全长向量,因为后者可能遇到奇怪的边缘情况(如果只有一行,它会做正确的事吗?)。