对于循环在R中没有按预期工作

时间:2015-02-14 02:32:26

标签: r for-loop vector data-analysis data-manipulation

我在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

谢谢!

1 个答案:

答案 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函数为tapplyave函数构建INDEX或分组变量是构建分组操作的简便方法。它可以让你进入矢量化/功能化思维模式(远离for循环习惯。)还有一个gl函数可以构建分组因子。