我在R
中有以下数据框 ship_no berth_day berth_time from_day to_day from_time to_time
ABC Saturday 19:00:00 Saturday Sunday 23:00:00 23:00:00
DEF Saturday 14:00:00 Saturday Sunday 13:00:00 04:00:00
ABC Tuesday 11:00:00 Saturday Sunday 23:00:00 23:00:00
我想知道的是有多少船只延误了,这意味着有多少船只错过了他们的服务窗口。
service window for ship ABC is from Saturday 11:00 PM to Sunday 11:00 PM and service window for ship DEF is from Saturday 13:00 PM to Sunday 4:00 PM
例如,对于货物ABC
,它已经到达Saturday
并且它已经到达的时间是19:00
,这不在窗口中。窗口从Saturday
23:00
开始,所以它已经提前了。如此明智如果它已提前或延迟。
我想要的数据框是
ship_no berth_day berth_time from_day to_day from_time to_time Delay/Early
ABC Saturday 19:00:00 Saturday Sunday 23:00:00 23:00:00 Early
DEF Saturday 14:00:00 Saturday Sunday 13:00:00 04:00:00 On Time
ABC Tuesday 11:00:00 Saturday Sunday 23:00:00 23:00:00 delay
berth_time,from_time and to_time is in character format
我们怎样才能在R?中做到这一点?
答案 0 :(得分:0)
希望这有帮助!
(假设 - 根据@Neil仅考虑1周的数据)
#Week start is Monday
library(chron)
df <- data.frame(ship_no=c('ABC','DEF','GHI'),
berth_day=c('Saturday','Saturday','Tuesday'),
berth_time=chron(times=c("19:00:00", "14:00:00", "11:00:00")),
from_day=c('Saturday','Saturday','Saturday'),
from_time=chron(times=c('23:00:00','13:00:00','23:00:00')),
to_day=c('Sunday','Sunday','Sunday'),
to_time=chron(times=c('23:00:00','04:00:00','23:00:00')))
dayCoding <- function(x){
ifelse (x == 'Monday', 0,
ifelse(x == 'Tuesday', 1,
ifelse(x == 'Wednesday', 2,
ifelse(x == 'Thursday', 3,
ifelse(x == 'Friday', 4,
ifelse(x == 'Saturday', 5,
6))))))
}
df1 <- cbind(df[c(1,3,5,7)],apply(df[c(2,4,6)], 2, dayCoding))
df1$calc_berth_time = df1$berth_time + df1$berth_day
df1$calc_from_time = df1$from_time + df1$from_day
df1$calc_to_time = df1$to_time + df1$to_day
statusCal <- function(x,y,z){
ifelse((x<y),'Early',
ifelse((x>=y & x<=z),'On Time', 'Delayed'))
}
df1$status <- mapply(statusCal, df1$calc_berth_time, df1$calc_from_time, df1$calc_to_time)
final_df <- merge(df, df1[,c("ship_no","status")], by="ship_no")
final_df
输入:
ship_no berth_day berth_time from_day from_time to_day to_time
1 ABC Saturday 19:00:00 Saturday 23:00:00 Sunday 23:00:00
2 DEF Saturday 14:00:00 Saturday 13:00:00 Sunday 04:00:00
3 GHI Tuesday 11:00:00 Saturday 23:00:00 Sunday 23:00:00
输出是:
ship_no berth_day berth_time from_day from_time to_day to_time status
1 ABC Saturday 19:00:00 Saturday 23:00:00 Sunday 23:00:00 Early
2 DEF Saturday 14:00:00 Saturday 13:00:00 Sunday 04:00:00 On Time
3 GHI Tuesday 11:00:00 Saturday 23:00:00 Sunday 23:00:00 Early