如何在R中运行最后一次迭代之前停止循环

时间:2014-02-03 22:40:41

标签: r loops

我正在尝试将阈值应用于RFID标签读取的数据集。我想保持所有读数之间的时间差大于指定的阈值。我写了一段代码来完成这项工作,但由于它是比较两行数据,当它到达最后一次迭代时,会产生错误。这是一个问题,bc我希望这个循环嵌入另一个循环中,错误会破坏整个过程。这是我的数据的样子。这只是一小部分,但它代表了更大的数据集。

data.rfid.split
                  date        Tag
1  0013-05-21 16:37:14 04179381FE
2  0013-05-21 16:39:54 04179381FE
3  0013-05-21 16:39:56 04179381FE
4  0013-05-21 16:39:58 04179381FE
5  0013-05-21 16:40:00 04179381FE
6  0013-05-21 16:40:02 04179381FE
7  0013-05-21 16:40:04 04179381FE
8  0013-05-21 16:40:06 04179381FE
9  0013-05-21 16:40:08 04179381FE
10 0013-05-21 16:40:10 04179381FE
11 0013-05-21 16:40:12 04179381FE
12 0013-05-21 16:40:14 04179381FE
13 0013-05-21 16:40:16 04179381FE
14 0013-05-21 16:40:18 04179381FE
15 0013-05-21 16:40:20 04179381FE
16 0013-05-21 16:40:22 04179381FE
17 0013-05-21 16:40:24 04179381FE
18 0013-05-21 16:40:26 04179381FE
19 0013-05-21 16:40:28 04179381FE
20 0013-05-21 16:40:30 04179381FE
21 0013-05-21 16:40:32 04179381FE
22 0013-05-21 16:40:34 04179381FE
23 0013-05-21 16:41:26 04179381FE
24 0013-05-21 16:41:31 04179381FE

#this is the threshold I want to use as to filter out unwanted reads.
thresh <- 33

这是我应用阈值的循环:

for(k in 2:length(data.rfid.split[,1])){
repeat{
  diff <- difftime(data.rfid.split[k,1], data.rfid.split[k-1,1], units = "secs")
  if(diff<thresh) data.rfid.split<-data.rfid.split[-(k), ]      
  if(diff>=thresh) break

  }
}

正如我所说,它给了我理想的结果:

                  date        Tag
1  0013-05-21 16:37:14 04179381FE
2  0013-05-21 16:39:54 04179381FE
19 0013-05-21 16:40:28 04179381FE
23 0013-05-21 16:41:26 04179381FE

但它也会出错:
  缺少需要TRUE / FALSE的值

如何使用这个循环另一个类似的循环来获得所需的结果而没有错误,以便这个循环可以嵌入到另一个循环中?

2 个答案:

答案 0 :(得分:2)

基本上,您希望在diff成为NA时停止。我在原始脚本中添加了一些其他小改进:

for (k in 2:nrow(data.rfid.split)) {
  repeat {
    diff <- difftime(data.rfid.split[k,1], data.rfid.split[k-1,1], units = "secs")
    if (is.na(diff)) break
    if (diff < thresh) data.rfid.split <- data.rfid.split[-k,]      
    else break
  }
}
data.rfid.split

答案 1 :(得分:1)

使用NA检查is.na()

# (...)    
if(!is.na(diff) & diff<thresh) data.rfid.split<-data.rfid.split[-(k), ]      
if(diff>=thresh | is.na(diff)) break
# (...)