r-构建间隔,然后计算最大Disjoint间隔数



我想知道按车站划分的地面最大飞行次数。

航班到达车站和离开车站时我都有时间。

我的数据帧是这种格式的问题

REG DEP ARV  STD                    STA
XYZ ZRH GVA  2021-08-01 07:20:00    2021-08-01 08:35:00
XYZ GVA ZRH  2021-08-01 09:20:00    2021-08-01 10:35:00
KLN MUC GVA  2021-08-01 06:00:00    2021-08-01 07:10:00
KLN GVA CGD  2021-08-01 08:45:00    2021-08-01 10:10:00

所以在这个例子中航班XYZ于08H35(STA一线(抵达GVA,然后于09H20(STD 2线(离开GVAKLN航班07H10抵达GVA,08H45起飞。所以从08h35到08h45,GVA有2次飞行。。

如果这一天只有这两个航班在GVA相遇,那么输出应该是2。

如果在一天中的其他时间有其他航班相遇,假设下午有5个航班在GVA相遇。所以输出应该是最大值,这意味着5

所以我想按航班[STA,STD]或[STD,STA]建立间隔,然后找到最大不联合间隔。。。

我尝试使用此代码来构建间隔,但不起作用。。

interval_sta_std<-function(i,j){
for (i in 1:length(df)){
key=  df$DEP[i]
min_key=min(df$STD[i])
max_key=max(df$STD[i])

for (j in 1:length(df)){
value=  df$ARV[j]
min_value=min(df$STA[j])
max_value=max(df$STA[j])

if(value==key) {


test_inter<-interval(min(min_value,min_key),
max(max_key,max_value))
}
}
}
return(test_inter)}

也许一种方法是查看数据中的每分钟,并计算该分钟甲板上有多少航班。根据数据的广度,这并不总是能很好地扩展,但如果将minutes限制在一个合理的范围内,那么它应该是可以的。

示例数据

quux <- structure(list(REG = c("XYZ", "XYZ", "KLN", "KLN"), DEP = c("ZRH", "GVA", "MUC", "GVA"), ARV = c("GVA", "ZRH", "GVA", "CGD"), STD = structure(c(1627816800, 1627824000, 1627812000, 1627821900), class = c("POSIXct", "POSIXt"), tzone = ""), STA = structure(c(1627821300, 1627828500, 1627816200, 1627827000), class = c("POSIXct", "POSIXt"), tzone = "")), row.names = c(NA, -4L), class = "data.frame")
quux[,c("STD","STA")] <- lapply(quux[,c("STD","STA")], as.POSIXct)

(将STDSTA转换为POSIXt对象。(

带模糊联接的基R

minutes <- seq(min(quux$STD), max(quux$STA), by = "mins")
head(minutes)
# [1] "2021-08-01 06:00:00 EDT" "2021-08-01 06:01:00 EDT" "2021-08-01 06:02:00 EDT" "2021-08-01 06:03:00 EDT"
# [5] "2021-08-01 06:04:00 EDT" "2021-08-01 06:05:00 EDT"
length(minutes)
# [1] 276
range(minutes)
# [1] "2021-08-01 06:00:00 EDT" "2021-08-01 10:35:00 EDT"

现在是联接和聚合。

joined <- fuzzyjoin::fuzzy_left_join(data.frame(M = minutes), quux, by = c("M" = "STD", "M" = "STA"), match_fun = list(`>=`, `<=`))
head(joined)
#                     M REG DEP ARV                 STD                 STA
# 1 2021-08-01 06:00:00 KLN MUC GVA 2021-08-01 06:00:00 2021-08-01 07:10:00
# 2 2021-08-01 06:01:00 KLN MUC GVA 2021-08-01 06:00:00 2021-08-01 07:10:00
# 3 2021-08-01 06:02:00 KLN MUC GVA 2021-08-01 06:00:00 2021-08-01 07:10:00
# 4 2021-08-01 06:03:00 KLN MUC GVA 2021-08-01 06:00:00 2021-08-01 07:10:00
# 5 2021-08-01 06:04:00 KLN MUC GVA 2021-08-01 06:00:00 2021-08-01 07:10:00
# 6 2021-08-01 06:05:00 KLN MUC GVA 2021-08-01 06:00:00 2021-08-01 07:10:00
nrow(joined)
# [1] 327

回想一下,我们在minutes中有276。现在我们有327个,表示51行(每分钟(表示一次甲板上有多个航班。

joined2 <- aggregate(REG ~ M, data = joined[complete.cases(joined),], FUN = length)
nrow(joined2)
# [1] 258
head(joined2)
#                     M REG
# 1 2021-08-01 06:00:00   1
# 2 2021-08-01 06:01:00   1
# 3 2021-08-01 06:02:00   1
# 4 2021-08-01 06:03:00   1
# 5 2021-08-01 06:04:00   1
# 6 2021-08-01 06:05:00   1

我们减少了一点,表明数据中一天中258分钟的时间里至少有一架飞机在甲板上;如果你看看REG > 1的位置,你会发现哪里有两个或更多。

最后一件:

joined2$Date <- as.Date(joined2$M)
aggregate(REG ~ Date, data = joined2, FUN = max)
#         Date REG
# 1 2021-08-01   2

注意:这可能会受到时区问题的影响,请确保您确信它们都是正确的。

相关内容

最新更新