【问题标题】:Sum between elements of a vector using indices of start and end positions使用开始和结束位置的索引在向量的元素之间求和
【发布时间】:2018-07-09 18:18:52
【问题描述】:

我有一个向量(在这种情况下是从数据帧中提取的),我想通过使用两个包含要使用的数据向量的开始和结束索引的附加向量来计算一些总和。为此,我在 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 之间求和。我正在努力寻找一种跨数百行数据框实现此功能的方法。

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

【问题讨论】:

    标签: r


    【解决方案1】:

    也许有更好的解决方案,但我编写了一些快速代码,可以为单个向量执行您想要的操作,如果这是您想要的,我确信可以重写其中的一些代码来计算多列的总和。

     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 专家),但这应该可行。

    【讨论】:

    • 这很棒@astel - 让我大部分时间都在我需要的地方。但是,在我的数据中,我确实有 NA,我需要跳过,否则我会在结果向量中得到很多 NA 值。仍然是一个相对的 R 菜鸟,所以不确定在哪里指定参数 na.rm = TRUE 考虑到这些 for 循环中的总和不是调用该函数的标准方法。
    【解决方案2】:

    这将在没有太多检查的情况下工作,并且不包括 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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      相关资源
      最近更新 更多