R - for循环 - 两列的值相互依赖

时间:2017-12-01 14:57:17

标签: r

抱歉 - 我以前习惯使用Excel / Minitab / SQL,这种方式有所不同。

我有一个excel数据集,其中包含列" Date" (专栏" A"),"托盘" (列" B)," Lt" (专栏" K")和" Tt" (列" L"),其中列" Lt"的值和" Tt"依赖于彼此,以及固定参数(alpha和beta),它们列在电子表格的单元格中(分别为" T3"和#34; T4")。

在Excel中,我只需在单元格中输入Lt和Tt的公式" K6"和" L6"分别拖下来。然后Excel同时更新两列以达到正确的值。公式分别为=$T$3*K5+(1-$T$3)*(K5+L5)=$T$4*(C6-C5)+(1-$T$4)*L5

但是,在R中,我尝试使用for循环更新两列的值:

                for(i in 3:368)
            df[i,"Lt"]<-alpha*df[i-1,"Lt"]+(1-alpha)*(df[i-1,"Lt"]+df[i-1,"Tt"])
            for (i in 3:368)
            df[i,"Tt"]<-beta*(df[i,"Pallets"] - df[i-1,"Pallets"])+(1-beta)*df[i-1,"Tt"]

这个问题是这意味着两个列分别更改了它们的值。因此,他们在更新时不会互相交互,因此我最终会得到两个不太正确的列。

alpha和beta的值分别为269和0.787890411。在Excel中,我得到:

                Date    Pallets Lt  Tt
            01/01/2011  491     
            02/01/2011  385 269 0.79
            03/01/2011  662 269.7879    0.843133
            04/01/2011  28  270.6298    0.843133
            05/01/2011  46  271.4718    0.843132
            06/01/2011  403 272.3156    0.843132
            07/01/2011  282 273.1588    0.843133
            08/01/2011  315 274.0021    0.843133

然而对于R,因为两列不会同时更新,所以每次更新任一列时,Lt和Tt都会得到各种不同的值。目前我有:

                         Date Pallets       Lt        Tt
            1  28/12/2011     491       NA        NA
            2  29/12/2011     385 269.0000 0.7878904
            3  30/12/2011     662 269.7879 0.8431328
            4  31/12/2011      28 270.6310 0.7161642
            5  01/01/2012      46 271.3472 0.7196210
            6  02/01/2012     403 272.0668 0.7908770
            7  03/01/2012     282 272.8577 0.7665189
            8  04/01/2012     315 273.6242 0.7729656
            9  05/01/2012     327 274.3971 0.7752110
            10 06/01/2012     458 275.1724 0.8012559

如何让两个列更新并相互反映,就像在Minitab或Excel中自动发生一样?

1 个答案:

答案 0 :(得分:0)

结合for循环:

for(i in seq(3, nrow(df), by = 1)) {
  df[i,"Lt"]<-alpha*df[i-1,"Lt"]+(1-alpha)*(df[i-1,"Lt"]+df[i-1,"Tt"])
  df[i,"Tt"]<-beta*(df[i,"Pallets"] - df[i-1,"Pallets"])+(1-beta)*df[i-1,"Tt"]
}

此外,您不应该使用硬编码的数字来计算行数。这些可能会发生变化,并且在代码执行时不断更新代码会很痛苦。