在R中逐行累积

时间:2018-06-14 21:03:30

标签: r

嗨我正在尝试在R中做一个简单的累积模型。在excel中做的很简单,但当然我需要为大约1000个数据集做这个,所以我想在R中编码它。

简单地说,模型用于积累和融化雪。结果应该在“包”列中。这应该是前几天包装+雪融化。有关最佳方式调用前一天包的任何想法吗? (应在第1天以0积雪开始)

第二个问题是包装不能是负片,所以在它融化但没有积雪的日子里,包装应该保持在0。

df <- read.csv(file = "ddf_mod.csv", header = TRUE)
> df
   day snow melt pack
1    1    0    6    0
2    2    0    2    0
3    3    0    8    0
4    4    0    2    0
5    5    2    0    2
6    6    3    0    5
7    7    4    0    9
8    8    5    0   14
9    9    0    5    9
10  10    0    6    3
11  11    0    3    0
12  12    5    0    5
13  13    8    0   13
14  14    1    0   14
15  15    3    0   17
16  16    0    0   17

1 个答案:

答案 0 :(得分:1)

它不能低于0的部分使得它比正常情况稍微复杂一些,但您可以使用Reduce()完成此逐步计算。例如

new_melt <- Reduce(function(prev, change) {
     max(prev + change$snow - change$melt, 0)
  }, 
  split(df[c("snow","melt")], seq.int(nrow(df))), 
  init=0,
  accumulate = TRUE)[-1]

在这里,我们使用split()将雪/融化值分成一组观察对,然后我们迭代它们。每次取前一个值,添加雪,去除融化,并使用max()确保它永远不会低于0.(然后我们用[-1]删除初始值)。可以将此新值与原始数据合并,以查看它是否提供了您想要的内容

cbind(df, new_melt)
#    day snow melt pack new_melt
# 1    1    0    6    0        0
# 2    2    0    2    0        0
# 3    3    0    8    0        0
# 4    4    0    2    0        0
# 5    5    2    0    2        2
# 6    6    3    0    5        5
# 7    7    4    0    9        9
# 8    8    5    0   14       14
# 9    9    0    5    9        9
# 10  10    0    6    3        3
# 11  11    0    3    0        0
# 12  12    5    0    5        5
# 13  13    8    0   13       13
# 14  14    1    0   14       14
# 15  15    3    0   17       17
# 16  16    0    0   17       17