2015-12-07 148 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))