我在R中的数据框precip
中有变量parleys_data
,我尝试使用此变量生成向量precip_memory
。生成的向量中的元素将是precip
变量中具有相同索引的元素与precip
变量中的前一个元素(index-1)的总和。但是在precip
变量中处理了5个元素后,新向量应重置为0。因此,新向量是precip
变量中元素的累加和,在每5个元素后重置为0(零)。
(注意:新向量precip_memory
中的第一个元素默认为零)
例如:
precip = 1 2 3 4 1 7 3 5 1 5 6 7 8 1
precip_memory = 0 2 5 9 0 7 10 15 16 0 5 11 17 24 0 8 9
我有以下代码(循环设置最初只处理50个元素):
precip_memory=rep(NA,50)
precip_memory[1]=0
c=0
for (i in 1:50){
c=c+1
precip_memory[i+1]=parleys_data$precip[i+1]+precip_memory[i]
if(c==5){
precip_memory[i]=0
c=0
}
运行代码时出错了,我不知道发生了什么。
我的数据如下:
>head(parleys_data$precip,n=20)
[1] 0.1 0.0 0.3 0.1 0.9 0.1 0.2 0.1 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
所以我的结果应该是:
0 0 0.3 0.4 0 0.1 0.3 ........
但我明白了:
0.0 0.0 0.3 0.4 0.0 1.4 1.6 1.7 1.8 0.0 1.8 1.8 1.8 1.8 0.0 1.8 1.8 1.8 1.8 0.0
谢谢!
答案 0 :(得分:2)
除了这些群组中的第一个位置外,您似乎希望群组中每个项目的cumsum
除外:
> precip=scan()
1: 0.1 0.0 0.3 0.1 0.9 0.1 0.2 0.1 0.1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
21:
Read 20 items
> ave(precip, rep(1:4, each=5), FUN= function(x) c(0, cumsum(x[-1]) ) )
[1] 0.0 0.0 0.3 0.4 1.3 0.0 0.2 0.3 0.4 0.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
使用rep
函数为tapply
或ave
函数构建INDEX或分组变量是构建分组操作的简便方法。它可以让你进入矢量化/功能化思维模式(远离for循环习惯。)还有一个gl
函数可以构建分组因子。