2014-11-25 87 views
0

我得到了一個具有觀察間隔(以天爲單位)的向量,並且希望得到總計爲30天的值的索引。找到總計達到給定值的值的索引R

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} 
} 

謝謝!

+2

我不明白你的例子:與指數4,6,7的值給出20 – robert 2014-11-25 14:47:26

+0

他們總結到至少30了吧? – 2014-11-25 14:50:32

+0

是的,請參閱我的編輯 – Lukas 2014-11-25 14:54:51

回答

0

我認爲這是一個整數揹包問題,它有一個遞歸的解決方案。我不太確定多個for循環可以解決它。

+0

我不這麼認爲。我的數據是有序的,我不想改變這個順序。因此,我基本上尋找的是所有可能的序列總和至少爲30. – Lukas 2014-11-25 14:45:45

+2

按照這個答案,軟件包'adagio'提出了一個名爲'subsetsum'的函數:'subsetsum(interval,30)'給出了一個可能的解決方案。 – 2014-11-25 15:03:03

+0

我同意@VincentGuillemot。但對於5-10個元素,我猜測for循環有效。但是對於100,你需要一種不同的方法。 – Nikos 2014-11-25 15:14:21

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) 
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

這將只有一個循環工作,如果你使用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) 
    } 
}