我试图处理一组润滑油间隔,并确定日期是否在该集合的任何成员之内。我的时间间隔是不重叠的,但一般的答案是最好的。
在开始数据分析之前,我不知道在这组间隔中有多少间隔:
library(lubridate)
#Create 4 dates; 2 pairs
start1 <-ymd("2015-01-01")
stop1 <-ymd("2015-01-08")
start2 <-ymd("2015-02-01")
stop2 <-ymd("2015-02-08")
#Make 2 non-overlapping intervals
interval1 <-start1%--%stop1
interval2 <-start2%--%stop2
#two more dates, each within an interval
day1 <-ymd("2015-01-04")
day2 <-ymd("2015-02-04")
#now test the new dates against the intervals.
day1 %within%interval1 #TRUE
day2 %within%interval1 #FALSE
day2 %within%interval2 #TRUE我可以做到:
day2 %within%c(interval1, interval2) #(FALSE, TRUE)如果我想一想,我肯定会强迫自己成为一个真实的人。
但我怎么能问呢?
#Don't Run:
INTERVALS <-c(interval1, interval2, ... intervalN)
day2 %within% INTERVALS例如,X是在Y工作时发生的,其中“Y工作时”是间隔的向量。
有什么建议吗?
发布于 2017-01-28 01:18:04
您可以将所有内容向量化,然后使用lapply为您想要检查的每一天使用%within%:
library(lubridate)
start <-ymd("2015-01-01", "2015-02-01")
stop <-ymd("2015-01-08", "2015-02-08")
days <-ymd("2015-01-04", "2015-02-04")
lapply(days, `%within%`, start %--% stop)
#> [[1]]
#> [1] TRUE FALSE
#>
#> [[2]]
#> [1] FALSE TRUE它是days的每个元素的列表,是否在每个间隔中。若要检查days的每个元素是否在任何间隔内,请为*apply编写一个匿名函数
sapply(days, function(x){any(x %within% interval(start, stop))})
## [1] TRUE TRUE发布于 2021-11-06 11:54:19
您可以使用我的santoku包中的chop():
library(santoku)
chop(c(day1, day2), c(start1, stop1, start2, stop2))
## [1] [2015-01-01, 2015-01-08) [2015-02-01, 2015-02-08)
## Levels: [2015-01-01, 2015-01-08) [2015-02-01, 2015-02-08)请注意,这也将捕获stop1和start2之间的任何内容。然后,您可以选择您关心的时间间隔。或者你可以改变标签:
chop(c(day1, day2), c(start1, stop1, start2, stop2),
labels = c("Interval1", "Out2", "Interval2"))
## [1] Interval1 Interval2
## Levels: Interval1 Interval2https://stackoverflow.com/questions/41905358
复制相似问题