按R中的间隔集设置子集数据

死魔

我想根据一组间隔从向量中排除值。

示例数据:

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似乎是最好的,但我不喜欢它-它不可靠-您必须检查重叠的间隔等。

对于这个非常简单的问题,是否有更好的解决方案?谢谢

真实数据:我有时测量了光强度(日期时间,强度)。我也有日期时间间隔,测量设备处于维护状态(开始,结束)。现在,我要清除数据=排除维护期间测得的值(有效!)。

一个孩子

使用开发版本(1.9.7)data.table,大家可以试试%anywhere%

library(data.table)
# %anywhere% returns TRUE if mydata is within any mIntervals, else FALSE
ans <- mydata[!mydata %anywhere% mIntervals] 

但是,这将包括端点,这incbounds = TRUE是默认设置。如果需要排除端点,则可以使用以下语法:

mydata[!anywhere(mydata, mIntervals[, 1], mIntervals[, 2], incbounds = FALSE)]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章