嗨我正在尝试在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
答案 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