我有一个带有观察间隔(以天为单位)的向量,并希望获得总计最多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}
}
谢谢!
答案 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)