找到总和达到R中给定值的值的索引

时间:2014-11-25 14:28:27

标签: r sum

我有一个带有观察间隔(以天为单位)的向量,并希望获得总计最多30天的值的索引。

interval <- c(10, 12, 5, 5, 5, 5, 10)

所以我需要的是这样的矢量。 flag_endrow:4,6,7 因为:

sum(interval[1:4]) = 32  
sum(interval[2:6[) = 32  
sum(interval[3:7[) = 30

我尝试用循环(见下文)这样做,但失败了。有什么建议吗?

flag_endrow <- NULL
for (i in 1:length(interval)){
    for (j in i+1:length(interval)-1){
        if (sum(interval[i:j]) >= 30)
            {flag_endrow[i] <- j}
        break}
}

谢谢!

4 个答案:

答案 0 :(得分:1)

结束索引位于向量end

interval <- c(10, 12, 5, 5, 5, 5, 10)
begin <- NULL
end <- NULL
for (i in 1:(length(interval)-1)){
    for (j in (i+1):length(interval)){
        if (sum(interval[i:j]) >= 30){
            begin<- c(begin, i)
            end <- c(end, j)
            break
        }
    }
}

答案 1 :(得分:1)

如果你使用cumsum()函数,这只能用于一个循环。

interval <- c(10, 12, 5, 5, 5, 5, 10)

res <- c()

for(i in 1:length(interval)){
  v <- (cumsum(interval[i:length(interval)]) >= 30)
  val <- (which(v == TRUE)[1] + i - 1)
  if(!is.na(val)){
    res <- c(res, val )
  }
}

答案 2 :(得分:0)

我认为这是一个整数背包问题,它有一个递归解决方案。我不太确定多个for循环可以解决它。

答案 3 :(得分:0)

这是一个强力解决方案。它返回所有有效索引向量的列表。

target <- 30

unlist(lapply(si <- seq_along(interval), function(x) {
  idx <- combn(si, x)
  idx_t <- which(colSums(matrix(apply(idx, 2, function(i) interval[i]),
                                ncol = ncol(idx))) >= target)
  lapply(idx_t, function(i2) idx[ , i2])
}), recursive = FALSE)