我正在尝试将阈值应用于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的值
如何使用这个循环另一个类似的循环来获得所需的结果而没有错误,以便这个循环可以嵌入到另一个循环中?
答案 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
# (...)