代码之家  ›  专栏  ›  技术社区  ›  JerryN

再次在数据表上进行rowdies迭代

  •  0
  • JerryN  · 技术社区  · 7 年前

    至少有几个Q/a与此类似,但我似乎不太明白其中的诀窍。这是一个可复制的示例。DT保存数据。我想要食物(n)=食物(n-1)*x比率。食品(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的第一个值。不适用的食品

    1 回复  |  直到 7 年前
        1
  •  1
  •   Frank    7 年前

    我会重命名/重塑。。。

    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 ,因为后者可能会遇到奇怪的边缘情况(例如,如果只有一行,它会做正确的事情吗?)。