R 跳过多个循环迭代

R 跳过多个循环迭代,r,for-loop,skip,R,For Loop,Skip,我试图编写一个脚本,如果发现数据匹配,它将跳过接下来的两次迭代。 对于一个迭代,我可以使用“next”命令,但是跳过几个迭代是不行的 这是我的剧本 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

我试图编写一个脚本,如果发现数据匹配,它将跳过接下来的两次迭代。 对于一个迭代,我可以使用“next”命令,但是跳过几个迭代是不行的

这是我的剧本

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

rowsToDelete2000 | | data$V8[o]我建议自己用
重复
中断
来管理计数器,如下所示:

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
}

rowsToDeleteR在两个方面的操作不同

  • for
    循环不是这样工作的-正如您自己所注意到的,您不能修改循环变量。此外,您通常不会迭代索引,而是直接迭代元素

  • 要从vector/matrix/data.frame中选择或删除特定对象,只需通过数字或逻辑索引选择这些元素。您的代码已经朝着这个方向发展,但是您正在迭代地而不是一次性地构造这个索引(
    rowsToDelete

  • 作为(2)的推论,不要通过迭代连接在一行中创建向量或列表-这非常非常慢

    这里有一种不同的方法,使用R的矢量化表达式:

    rowsToDelete = data$reactionTime > 2000 | data$V8 < 9999
    
    这只是将向量先移动一个元素,然后再移动两个元素,并通过逻辑“或”组合它们。但是,请注意,这会导致警告,因为现在我们通过“或”组合的向量不再具有相同的长度。总的来说,注意这个警告是个好主意。在这里,我们可以通过使用一个小助手函数来避免它:

    shift = function (x, element = FALSE) c(element, x[-length(x)])
    
    rowsToDelete = data$reactionTime > 2000 | data$V8 < 9999
    rowsToDelete = rowsToDelete | shift(rowsToDelete) | shift(shift(rowsToDelete))
    
    shift=function(x,element=FALSE)c(element,x[-长度(x)])
    rowsToDelete=数据$reactionTime>2000 |数据$V8<9999
    rowsToDelete=rowsToDelete | shift(rowsToDelete)| shift(shift(rowsToDelete))
    
    您能准确描述一下您想做什么吗?也许有一种更简单的方法。(例如,获取满足条件的行,然后推断需要删除的行)。(注意:由于
    rowsToDelete
    是一个向量,请使用
    c(rowsToDelete,…)
    而不是
    rbind
    ),我会建议您使用任何其他解决方案。这是用C语言编程的方式,而不是用R语言。
    shift = function (x, element = FALSE) c(element, x[-length(x)])
    
    rowsToDelete = data$reactionTime > 2000 | data$V8 < 9999
    rowsToDelete = rowsToDelete | shift(rowsToDelete) | shift(shift(rowsToDelete))