2016-03-03 169 views
1

下面是一個玩具模型的東西,是造成我的問題。我有一個T和F的向量。我想遍歷這個向量,如果最後3個元素的總和大於等於1(這意味着至少有1個元素爲TRUE),我將空向量中的元素賦值爲1,否則我在空向量爲0.這樣,當for循環遍歷起始向量時,我用1和0填充空向量。我遇到的問題是一個錯誤,我將在下面粘貼。如果語句內循環

two_true <- c(T,F,F,F,F,F,F,F,F,T,T,T,F,F,T,F,F,F,F,F,F) 

look_bac <- 3 

no_signal1 <- c() 
for(i in 1:length(two_true)) { 
     if(sum(two_true[i:(i+look_bac-1)]) >= 1) { 
       no_signal1[i] <- 1 
     } else { 
         no_signal1[i] <- 0 
       } 
} 

運行這給了我以下錯誤:

錯誤如果(總和(two_true [I:第(i + look_bac - 1)])> = 1){: 缺失值,其中TRUE/FALSE需要

我似乎並沒有得到這個,因爲if語句的條件顯然是TRUE或FALSE變體。我知道可能有許多其他方法來創建這個新的向量,但我想學習R基礎知識,所以使用上述工具(如果語句和for循環)的任何幫助將有所幫助。謝謝!

+3

調試循環時,最好知道問題是否僅在某些迭代中發生。在你的循環中放入一個'print(i)'命令,運行所有內容,並查看錯誤之前循環得到多少。然後,當你看到'i'是20或21時可能會發生問題,將'i'設置爲其中一個值並運行違規行:'sum(two_true [i:(i + look_bac-1)]) > = 1'。你可以減少它,並找到問題,'two_true [我:((i + look_bac-1)]',並思考爲什麼它不適用於'我'的價值。 – Gregor

+2

,因爲當你20歲以後,你的if語句將返回NA,這就是爲什麼你會收到錯誤信息。 – fhlgood

+2

第一條評論:*如何釣魚*;第二條評論*這裏是你的魚*。 – Gregor

回答

0

由於評論中的漁民已經指出(@Gregor,@Mike Fang),因此您的向量的最後一個元素的和會返回NA,因爲您的總和爲i=20sum(c(FALSE, FALSE, NA))

解決方案 - 添加na.rm=TRUE選項sum()

if(sum(two_true[i:(i+look_bac-1)], na.rm=TRUE) >= 1) { 

但是,由於是循環的敵人猛烈R是不是真的環路友好的環境:的apply功能的大房子,通常逃脫任何循環速度的較量:

library(zoo) 
as.numeric(rollapply(two_true, 3 ,sum, partial=TRUE, align="left")>0) 

返回與您的循環在單行:

> as.numeric(rollapply(two_true, 3 ,sum, partial=TRUE, align="left")>0) 
[1] 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 
> no_signal1 
[1] 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 

因此,總結一下,歡迎來到R和我們友好的apply功能!