2015-12-07 147 views
1

我想編寫一個腳本,如果它發現數據匹配,則跳過接下來的兩個迭代。 對於一次迭代,我可以使用「下一個」命令,但這不適用於跳過幾次迭代。跳過多個循環迭代

這是我的腳本。

rowsToDelete<-c() 

for(o in 1:nrow(data)){ 
    if(data$reactionTime[o]>2000||data$V8[o]<9999){ 

     rowsToDelete<-rbind(rowsToDelete,TRUE,TRUE,TRUE) 
     o<-o+2 

    } 
    else{ 
     rowsToDelete<-rbind(rowsToDelete,FALSE) 
    } 
} 

我只是無法弄清楚,爲什麼用在o<-o+2如果循環不會跳過接下來的兩個迭代,它只是放大13000迭代量14430(所不同的是壞的案件數額的部分我的數據時間2)。

+2

你能描述一下你想要做什麼嗎?可能有一種更簡單的方法來做到這一點。 (例如,獲取哪些行滿足條件,然後推斷您需要刪除哪些行)。 (nb:因爲'rowsToDelete'是一個向量,使用'c(rowsToDelete,...)'而不是'rbind') – Cath

回答

1

我會建議自己與repeatbreak這樣的管理計數器:

rowsToDelete<-c() 
o<-1 
repeat{ 
    if(data$reactionTime[o]>2000||data$V8[o]<9999){ 
    rowsToDelete<-rbind(rowsToDelete,TRUE,TRUE,TRUE) 
    o<-o+2 
    } 
    else{ 
    rowsToDelete<-rbind(rowsToDelete,FALSE) 
    o<-o+1 
    } 

    if (o == nrow(data)) break 
} 
+2

我會建議字面*任何*其他解決方案。這是你如何編程在C中,而不是在R. –

1

[R操作方式有所不同,有兩個方面。

  1. for循環不會像這樣工作 - 你不能修改循環變量,因爲你已經注意到自己。此外,你通常不是迭代索引,而是直接對元素進行迭代。

  2. 要從vector/matrix/data.frame中選擇或刪除特定對象,只需通過數字或邏輯索引選擇這些元素。你的代碼已經打算在這個方向,但你構建這個指數(rowsToDelete)迭代,而不是在一個去

由於(2),不連續創建向量或列表的必然結果通過迭代連接 - 它確實很慢。

這裏有一個不同的方式,使用的r矢量化表達:

rowsToDelete = data$reactionTime > 2000 | data$V8 < 9999 

請注意,我把它換成||與矢量化|。這將返回一個向量,其元素是滿足條件的TRUE。接下來,我們需要擴展該邏輯向量,使得如果在索引的元素TRUE,那些在索引 1和 2也將TRUE

rowsToDelete = rowsToDelete | c(FALSE, rowsToDelete) | c(FALSE, FALSE, rowsToDelete) 

這隻需將矢量移動一個元素,然後移動兩個元素,然後通過邏輯「或」進行組合。但是請注意,這會導致警告,因爲現在我們通過「或」組合的向量不再具有相同的長度。總的來說,注意這個警告是個好主意。我們可以在這裏避免使用一個小幫手功能:

shift = function (x, element = FALSE) c(element, x[-length(x)]) 

rowsToDelete = data$reactionTime > 2000 | data$V8 < 9999 
rowsToDelete = rowsToDelete | shift(rowsToDelete) | shift(shift(rowsToDelete))