首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中优化顺序向量搜索

在R中优化顺序向量搜索
EN

Stack Overflow用户
提问于 2020-06-26 19:34:37
回答 2查看 42关注 0票数 0

我有个问题:

代码语言:javascript
复制
times <- c('2020-06-26 10:00', '2020-06-26 10:10', '2020-06-26 10:11', '2020-06-26 10:15',
'2020-06-26 10:16','2020-06-26 10:17') #large, ordered vector
dateTimeToCheck1 <- '2020-06-26 10:12'
dateTimeToCheck2 <- '2020-06-26 10:16'
result <- times < dateTimeToCheck2 & times > dateTimeToCheck1

在有序向量中,我想将每个元素与常量值进行比较。知道向量是有序的,最有效的方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2020-06-26 19:40:35

这是你想要的吗?

代码语言:javascript
复制
times <- as.POSIXct(c('2020-06-26 10:00', '2020-06-26 10:10', '2020-06-26 10:11', '2020-06-26 10:15',
           '2020-06-26 10:16','2020-06-26 10:17')) #large, ordered vector
dateTimeToCheck1 <- as.POSIXct('2020-06-26 10:12')
dateTimeToCheck2 <- as.POSIXct('2020-06-26 10:16')

times[which(times < dateTimeToCheck2)]
# [1] "2020-06-26 10:00:00 GMT"
# [2] "2020-06-26 10:10:00 GMT"
# [3] "2020-06-26 10:11:00 GMT"
# [4] "2020-06-26 10:15:00 GMT"

times[which(times > dateTimeToCheck1)]
# [1] "2020-06-26 10:15:00 GMT"
# [2] "2020-06-26 10:16:00 GMT"
# [3] "2020-06-26 10:17:00 GMT"

# EDIT
times[which(times > dateTimeToCheck1 & times < dateTimeToCheck2)]
# [1] "2020-06-26 10:15:00 GMT"
票数 0
EN

Stack Overflow用户

发布于 2020-06-26 21:55:38

你可以查看:Find position of first value greater than X in a vector

然后试着这样做:

代码语言:javascript
复制
l <- Position(function(x) x > dateTimeToCheck1, times)
r <- Position(function(x) x >= dateTimeToCheck2, times) - 1

lgl_vec <- rep(FALSE, length(times))

true_indices <- if(is.na(l)){
    NULL
  } else if(is.na(r)) {
    l:length(times)
  } else {
    l:r
  }

lgl_vec[true_indices] <- TRUE

输出

代码语言:javascript
复制
lgl_vec
[1] FALSE FALSE FALSE  TRUE FALSE FALSE

阅读?Position中的right参数,如果你知道你的dateTimeToCheck离哪个边缘更近(开始/结束),它可能会减少操作的数量。

其他方法

如果使用了两次Position,您可以编写自己的循环(或函数)来查找lr

代码语言:javascript
复制
l_found <- r_found <- FALSE
for(i in seq_along(times)){
  
  if(!l_found && times[[i]] > dateTimeToCheck1){
    l <- i
    l_found <- TRUE
  }

  if(!r_found && times[[i]] >= dateTimeToCheck2){
    r <- i - 1
    r_found <- TRUE
    break()
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62593864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档