使用开始和结束位置的索引的向量元素之间的总和

时间:2018-07-09 18:18:53

标签: r

我有一个向量(在这种情况下是从数据帧中提取),我想通过使用两个另外的向量来计算一些总和,这些向量包含要使用的数据向量的开始和结束索引。为此,我正在R中工作。

例如,我用于计算的向量是:

Data Vector:
[1] 1.45
[2] 1.56
[3] 1.57
[4] 1.40
[5] 3.45
[6] 1.45
[7] 1.66
[8] 2.03
[9] 1.33

使用我的数据帧中的其他信息,我计算了另外两个包含上述向量的索引位置的向量,我将其称为“开始”和“停止”以表示要在其之间求和的范围。例如:

Start: 
[1] 1 
[2] 4
[3] 7

End: 
[1] 3 
[2] 6
[3] 9

我想使用这两个索引向量在我的数据向量中的元素1-3、4-6和7-9之间求和。我正在努力在跨数百行的数据框架中实现此方法。

我现在正在尝试编写一个函数来执行此操作,但是想要解决这个问题,以防我缺少一个更简单的解决方案。

2 个答案:

答案 0 :(得分:1)

这不需要太多检查就可以工作,并且不包括 N/As(希望您已经从数字向量来自的 data.frame 中过滤掉了它们)。

subSums <- function(vector, start_vector, end_vector){
  if (length(start_vector) != length(end_vector)){
    print("Start and End Point vectors are not the same length")
    return()
  }
  
  result <- NULL
  for (index in seq_along(start_vector)) {
    result[index] <- sum(vector[start_vector[index]:end_vector[index]])
  }
  
  return(result)
}

使用示例:

vec<-1:20
subSums(vec, c(1,3), c(2,4))

答案 1 :(得分:0)

也许有更好的解决方案,但是我写了一些快速代码来完成单个向量的工作,如果可以的话,我可以重写其中的一些代码来计算多个列的总和。

  

sum <-c(rep(0,length(start)))

     

for(i in 1:length(start)){

for (j in start[i]:end[i]){

      if(is.na(data[j] == FALSE)){
      sum[i]<-sum[i]+data[j]
      }

}
     

}

经过编辑可与NA一起使用。再次可能是一种更好的方法(我也不是R专家),但是应该可以。