我需要一种有效的方法来填充计算表,该表需要不同列中的前面行来获得当前值.

我以前问过类似的问题,但不清楚,所以下面是一个新的示例代码和我目前的操作方式(慢):

df = data.frame(elevation = seq(1,10),
      inflow = c(3,4,6,4,3,5,6,7,8,9),
      outflow = NA,
      storage = NA,
      stat = NA)


for(i in 1:nrow(df)) {
  
  if (i == 1) {
    
    df$outflow[i] = 0
    df$storage[i] = 0
    df$stat[i] = 0
    
  } else {
    
    df$outflow[i] = df$inflow[i-1]/2 + df$stat[i-1] + df$storage[i-1]
    df$storage[i] = df$inflow[i] - df$outflow[i] + df$stat[i-1]
    df$stat[i] = df$inflow[i-1] + df$stat[i-1] - df$storage[i-1] 
    
  }
  
 
}

df
   elevation inflow outflow storage stat
1          1      3     0.0     0.0  0.0
2          2      4     1.5     2.5  3.0
3          3      6     7.5     1.5  4.5
4          4      4     9.0    -0.5  9.0
5          5      3    10.5     1.5 13.5
6          6      5    16.5     2.0 15.0
7          7      6    19.5     1.5 18.0
8          8      7    22.5     2.5 22.5
9          9      8    28.5     2.0 27.0
10        10      9    33.0     3.0 33.0

推荐答案

由于每个计算依赖于上一次计算的结果,并且它们可能并不总是与简单的累积数学计算(例如,cumsum)一致,因此我们可以使用Reduce来获得所需的结果.

# initial conditions
df[1,c("outflow", "storage", "stat")] <- 0
# update each row iteratively
Reduce(function(dat, i) {
  dat$outflow[i] = dat$inflow[i-1]/2 + dat$stat[i-1] + dat$storage[i-1]
  dat$storage[i] = dat$inflow[i] - dat$outflow[i] + dat$stat[i-1]
  dat$stat[i] = dat$inflow[i-1] + dat$stat[i-1] - dat$storage[i-1]
  dat
}, 2:nrow(df), init = df)
#    elevation inflow outflow storage stat
# 1          1      3     0.0     0.0  0.0
# 2          2      4     1.5     2.5  3.0
# 3          3      6     7.5     1.5  4.5
# 4          4      4     9.0    -0.5  9.0
# 5          5      3    10.5     1.5 13.5
# 6          6      5    16.5     2.0 15.0
# 7          7      6    19.5     1.5 18.0
# 8          8      7    22.5     2.5 22.5
# 9          9      8    28.5     2.0 27.0
# 10        10      9    33.0     3.0 33.0

Reduce的流程是迭代2:nrow(df)中的每一个,并使用该数字作为第二个参数调用函数(i);内部函数的第一个参数是前一次函数调用的结果,在第一次调用时,该函数被init实例化为df.(如果我们没有提供init=,那么内部函数的两个参数应该是2:nrow(df)中的前两个值,即23,这不是我们需要的.)

accumulate=TRUE添加到调用中可能会提供信息(如果您想了解Reduce在做什么),它会在每次调用内部函数后显示数据(dat)的值:

df[1,c("outflow", "storage", "stat")] <- 0
Reduce(function(dat, i) {
  dat$outflow[i] = dat$inflow[i-1]/2 + dat$stat[i-1] + dat$storage[i-1]
  dat$storage[i] = dat$inflow[i] - dat$outflow[i] + dat$stat[i-1]
  dat$stat[i] = dat$inflow[i-1] + dat$stat[i-1] - dat$storage[i-1]
  dat
}, seq_len(nrow(df))[-1], init = df, accumulate = TRUE)
# [[1]]
#    elevation inflow outflow storage stat
# 1          1      3       0       0    0
# 2          2      4      NA      NA   NA
# 3          3      6      NA      NA   NA
# 4          4      4      NA      NA   NA
# 5          5      3      NA      NA   NA
# 6          6      5      NA      NA   NA
# 7          7      6      NA      NA   NA
# 8          8      7      NA      NA   NA
# 9          9      8      NA      NA   NA
# 10        10      9      NA      NA   NA
# [[2]]
#    elevation inflow outflow storage stat
# 1          1      3     0.0     0.0    0
# 2          2      4     1.5     2.5    3
# 3          3      6      NA      NA   NA
# 4          4      4      NA      NA   NA
# 5          5      3      NA      NA   NA
# 6          6      5      NA      NA   NA
# 7          7      6      NA      NA   NA
# 8          8      7      NA      NA   NA
# 9          9      8      NA      NA   NA
# 10        10      9      NA      NA   NA
# [[3]]
#    elevation inflow outflow storage stat
# 1          1      3     0.0     0.0  0.0
# 2          2      4     1.5     2.5  3.0
# 3          3      6     7.5     1.5  4.5
# 4          4      4      NA      NA   NA
# 5          5      3      NA      NA   NA
# 6          6      5      NA      NA   NA
# 7          7      6      NA      NA   NA
# 8          8      7      NA      NA   NA
# 9          9      8      NA      NA   NA
# 10        10      9      NA      NA   NA
# [[4]]
#    elevation inflow outflow storage stat
# 1          1      3     0.0     0.0  0.0
# 2          2      4     1.5     2.5  3.0
# 3          3      6     7.5     1.5  4.5
# 4          4      4     9.0    -0.5  9.0
# 5          5      3      NA      NA   NA
# 6          6      5      NA      NA   NA
# 7          7      6      NA      NA   NA
# 8          8      7      NA      NA   NA
# 9          9      8      NA      NA   NA
# 10        10      9      NA      NA   NA
# [[5]]
#    elevation inflow outflow storage stat
# 1          1      3     0.0     0.0  0.0
# 2          2      4     1.5     2.5  3.0
# 3          3      6     7.5     1.5  4.5
# 4          4      4     9.0    -0.5  9.0
# 5          5      3    10.5     1.5 13.5
# 6          6      5      NA      NA   NA
# 7          7      6      NA      NA   NA
# 8          8      7      NA      NA   NA
# 9          9      8      NA      NA   NA
# 10        10      9      NA      NA   NA
# [[6]]
#    elevation inflow outflow storage stat
# 1          1      3     0.0     0.0  0.0
# 2          2      4     1.5     2.5  3.0
# 3          3      6     7.5     1.5  4.5
# 4          4      4     9.0    -0.5  9.0
# 5          5      3    10.5     1.5 13.5
# 6          6      5    16.5     2.0 15.0
# 7          7      6      NA      NA   NA
# 8          8      7      NA      NA   NA
# 9          9      8      NA      NA   NA
# 10        10      9      NA      NA   NA
# [[7]]
#    elevation inflow outflow storage stat
# 1          1      3     0.0     0.0  0.0
# 2          2      4     1.5     2.5  3.0
# 3          3      6     7.5     1.5  4.5
# 4          4      4     9.0    -0.5  9.0
# 5          5      3    10.5     1.5 13.5
# 6          6      5    16.5     2.0 15.0
# 7          7      6    19.5     1.5 18.0
# 8          8      7      NA      NA   NA
# 9          9      8      NA      NA   NA
# 10        10      9      NA      NA   NA
# [[8]]
#    elevation inflow outflow storage stat
# 1          1      3     0.0     0.0  0.0
# 2          2      4     1.5     2.5  3.0
# 3          3      6     7.5     1.5  4.5
# 4          4      4     9.0    -0.5  9.0
# 5          5      3    10.5     1.5 13.5
# 6          6      5    16.5     2.0 15.0
# 7          7      6    19.5     1.5 18.0
# 8          8      7    22.5     2.5 22.5
# 9          9      8      NA      NA   NA
# 10        10      9      NA      NA   NA
# [[9]]
#    elevation inflow outflow storage stat
# 1          1      3     0.0     0.0  0.0
# 2          2      4     1.5     2.5  3.0
# 3          3      6     7.5     1.5  4.5
# 4          4      4     9.0    -0.5  9.0
# 5          5      3    10.5     1.5 13.5
# 6          6      5    16.5     2.0 15.0
# 7          7      6    19.5     1.5 18.0
# 8          8      7    22.5     2.5 22.5
# 9          9      8    28.5     2.0 27.0
# 10        10      9      NA      NA   NA
# [[10]]
#    elevation inflow outflow storage stat
# 1          1      3     0.0     0.0  0.0
# 2          2      4     1.5     2.5  3.0
# 3          3      6     7.5     1.5  4.5
# 4          4      4     9.0    -0.5  9.0
# 5          5      3    10.5     1.5 13.5
# 6          6      5    16.5     2.0 15.0
# 7          7      6    19.5     1.5 18.0
# 8          8      7    22.5     2.5 22.5
# 9          9      8    28.5     2.0 27.0
# 10        10      9    33.0     3.0 33.0

R相关问答推荐

咕噜中的元素列表:map

selectInput不返回ALL,并将因子转换为shiny 的数字

在"gt"表中添加第二个"groupname_col",而不连接列值

我想在R中总结一个巨大的数据框架,使我只需要唯一的lat、lon、Date(Year)和Maxium Value""""""""

LOF中的插图短文字幕

当我们有多个反斜杠和/特殊字符时使用Gsubing

根据纬度和距离连接两个数据集

为什么在写入CSV文件时Purrr::Pwalk不起作用

访问数据帧中未定义的列时出现R错误

如何在条形图中的x和填充变量中包含多个响应变量?

Ggplot2如何找到存储在对象中的残差和拟合值?

如何合并不同列表中的数据文件,包括基于名称的部分匹配,而不是一对一等价

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)

条形图中的条形图没有try 赋予它们的 colored颜色

如何在R中添加标识连续日期的新列

创建两个变量组合的索引矩阵

使用nls()函数的非线性模型的半正态图

以列名的字符向量作为参数按行应用自定义函数

R中刻面网格中的排序条形图

如何从R调用Amazon销售合作伙伴API?