我想根据一组间隔从矢量中排除值。子集数据按R中的间隔集合
实施例的数据:
mydata <- sort(runif(100,0,300))
mIntervals <- data.frame(start = c(2,50,97,159) , end = c(5,75, 120, 160))
解决方法1:使用简单的子集() - 不适合 - 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中花费太长时间。
Solution3:功能findIntervals
require(FSA)
valid <- findInterval(mydata, sort(c(mIntervals$start, mIntervals$end)))
mydata[is.even(valid)]
Solution4:使用某种方式打包 '间隔',但也没有合适的功能(或许interval_overlap())
相当类似(但不相同)的问题已被讨论here。但是有整数向量的解决方案,而不是连续变量。
我没有更多的想法。解决方案编号3似乎是最好的,但我不喜欢它 - 它不健壮 - 你将不得不检查重叠间隔等。
有没有更好的解决这个非常简单的问题? Thx
实际数据:我在某些时间测量了光强度(日期时间,强度)。测量设备正在进行维护(开始,结束)的日期时间也有间隔。 现在我想清除数据=排除在维护期间测量的值(高效!)。
这是否对你有用?我不确定你期望的输出是什么,但是基于我所能看到的来写这个。 'MYDATA [MYDATA> mIntervals $开始与MYDATA
Bas
修改你的'findInterval',你可以使用'MYDATA [findInterval(MYDATA,mIntervals $开始)<= findInterval (mydata,mIntervals $ end)]' –
@Bas:这不起作用--mydata和mIntervals的长度不同,结果不是我想要的。但thx –