我有个问题:
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在有序向量中,我想将每个元素与常量值进行比较。知道向量是有序的,最有效的方法是什么?
发布于 2020-06-26 19:40:35
这是你想要的吗?
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"发布于 2020-06-26 21:55:38
你可以查看:Find position of first value greater than X in a vector
然后试着这样做:
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输出
lgl_vec
[1] FALSE FALSE FALSE TRUE FALSE FALSE阅读?Position中的right参数,如果你知道你的dateTimeToCheck离哪个边缘更近(开始/结束),它可能会减少操作的数量。
其他方法
如果使用了两次Position,您可以编写自己的循环(或函数)来查找l和r
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()
}
}https://stackoverflow.com/questions/62593864
复制相似问题