R中的一组间隔的子集数据

Dea*_*Vil 4 r subset

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

示例数据:

mydata <-  sort(runif(100,0,300))
mIntervals <- data.frame(start = c(2,50,97,159) , end = c(5,75, 120, 160))
Run Code Online (Sandbox Code Playgroud)

解决方案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]
Run Code Online (Sandbox Code Playgroud)

这种解决方案在R中耗时太长

解决方案3:函数findIntervals

   require(FSA)
   valid <- findInterval(mydata, sort(c(mIntervals$start, mIntervals$end)))
   mydata[is.even(valid)]
Run Code Online (Sandbox Code Playgroud)

解决方案4:以某种方式使用包'间隔',但也没有合适的功能(可能是interval_overlap())

这里已经讨论了相似(但不完全相同)的问题.但是有整数向量的解决方案,而不是连续变量.

我没有更多的想法.解决方案号 3似乎是最好的,但我不喜欢它 - 它不健壮 - 你必须检查重叠间隔等.

这个非常简单的问题有没有更好的解决方案?谢谢

真实数据:我有时会测量光强度(日期时间,强度).我还有测量设备维护(开始,结束)的日期时间间隔.现在我想清理数据=排除在维护期间测量的值(有效!).

mto*_*oto 8

使用开发版本(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] 
Run Code Online (Sandbox Code Playgroud)

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

mydata[!anywhere(mydata, mIntervals[, 1], mIntervals[, 2], incbounds = FALSE)]
Run Code Online (Sandbox Code Playgroud)

  • 哦,不错的新功能:https://github.com/Rdatatable/data.table/issues/679 (2认同)

RHA*_*RHA 6

如果重新排列间隔,则可以使用该cut功能,然后仅取出奇数间隔:

NEWinterval <- c(2,5,50,75,97,120,159,160)
mydata[cut(mydata, NEWinterval,labels = F) %% 2 != 0]
Run Code Online (Sandbox Code Playgroud)