我希望能够根据一组区间从向量中排除值。
示例数据:
mydata <- sort(runif(100,0,300))
mIntervals <- data.frame(start = c(2,50,97,159) , end = c(5,75, 120, 160))
解决方案1:使用简单的subset() - 不适用于mIntervals长度较大的情况
解决方案2:使用嵌套的for循环:
valid <- vector(length(mydata))
valid <- TRUE
for(i in 1:length(mydata){
for(j in 1:length(mIntervals){
if(mydata[i] > mIntervals[j,]$start & mydata[i] < mIntervals[j,]$end){
valid[i] <- FALSE
}
}
}
mydata[valid]
这个方案在R中执行时间太长。 解决方案3:函数“findIntervals”
require(FSA)
valid <- findInterval(mydata, sort(c(mIntervals$start, mIntervals$end)))
mydata[is.even(valid)]
解决方案4:使用一些包“Intervals”,但是也没有合适的函数(也许是interval_overlap())。
这个问题已经在这里讨论过了,虽然有针对整数向量的解决方案,但并不适用于连续变量。
我没有更多的想法。解决方案3似乎是最好的,但我不喜欢它——它不够健壮——你需要检查重叠的时间间隔等。
是否有更好的解决这个看似简单的问题的方法?谢谢
真实数据:我有一些时间(日期时间、强度)上测量的光强度。我还有一些日期时间间隔,表示测量设备在此期间处于维护状态(开始、结束)。现在我想有效地清理数据=排除在维护期间测得的值。
mydata[mydata > mIntervals$start & mydata < mIntervals$end] <- FALSE
编辑:必须是单引号。 - BasfindInterval
函数,你可以使用mydata[findInterval(mydata, mIntervals$start) <= findInterval(mydata, mIntervals$end)]
。 - alexis_laz