我想根据一组间隔从向量中排除值。
示例数据:
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] 删除。
我来说两句