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