我想根据两个变量之间的时间范围添加一个新变量。我希望 8:01-20:00 = 白天之间的时间和 20:01-8:00 = 晚上之间的时间,以及任何与两者重叠的时间混合。
我尝试手动添加变量,但试图了解这是否可以通过更简单的方法完成。
#Current database
id<-c("m1","m1","m1","m2","m2","m2","m3","m4","m4")
x<-c("2020-01-03 10:00:00","2020-01-03 16:00:00","2020-01-03 19:20:00","2020-01-05 10:00:00","2020-01-05 15:20:00","2020-01-05 20:50:00","2020-01-06 06:30:00","2020-01-08 06:30:00","2020-01-08 07:50:00")
start<-strptime(x,"%Y-%m-%d %H:%M:%S")
y<-c("2020-01-03 16:00:00","2020-01-03 19:20:00","2020-01-03 20:50:00","2020-01-05 15:20:00","2020-01-05 20:50:00","2020-01-05 22:00:00","2020-01-06 07:40:00","2020-01-08 07:50:00","2020-01-08 08:55:00")
end<-strptime(y,"%Y-%m-%d %H:%M:%S")
mydata<-data.frame(id,start,end)
#output
day.night<-c("day","day","mixed","day","mixed","night","night","night","mixed")
newdata<-cbind(mydata,day.night)
编辑:抱歉我忘了添加日期。
一种使用方法dplyr
是将start.time
和转换end.time
为POSIXct
对象,然后以不同的间隔比较值并使用 应用标签case_when
。
library(dplyr)
data %>%
mutate(start.time1 = as.POSIXct(start.time, format = "%H:%M"),
end.time1 = as.POSIXct(end.time, format = "%H:%M"),
day.night = case_when(
start.time1 > as.POSIXct('08:01:00', format = "%T") &
end.time1 < as.POSIXct('20:00:00', format = "%T") ~"day",
start.time1 > as.POSIXct('20:01:00', format = "%T") |
start.time1 < as.POSIXct('08:00:00', format = "%T") &
end.time1 < as.POSIXct('08:00:00', format = "%T") ~ "night",
TRUE ~ "mixed")) %>%
select(names(data), day.night)
# id start.time end.time day.night
#1 m1 10:00 16:00 day
#2 m1 16:00 19:20 day
#3 m1 19:20 20:50 mixed
#4 m2 10:00 15:20 day
#5 m2 15:20 20:50 mixed
#6 m2 20:50 22:00 night
#7 m3 06:30 07:40 night
#8 m4 06:30 07:50 night
#9 m4 07:50 08:55 mixed
编辑
如果我们也有一个最新的方法是更换日期分量start
和end
与今天的日期进行比较。
library(dplyr)
library(lubridate)
mydata %>%
mutate_at(vars(start, end), ymd_hms) %>%
mutate(start_hour = hour(start),
end_hour = hour(end),
day.night = case_when(start_hour >= 8 & end_hour >= 8 & end_hour < 20 ~ "day",
start_hour >= 20 & (end_hour < 8 | end_hour <= 23) |
(start_hour < 8 & end_hour < 8)~ "night",
TRUE ~ "mixed"))
# id start end day.night
#1 m1 2020-01-03 10:00:00 2020-01-03 16:00:00 day
#2 m1 2020-01-03 16:00:00 2020-01-03 19:20:00 day
#3 m1 2020-01-03 19:20:00 2020-01-03 20:50:00 mixed
#4 m2 2020-01-05 10:00:00 2020-01-05 15:20:00 day
#5 m2 2020-01-05 15:20:00 2020-01-05 20:50:00 mixed
#6 m2 2020-01-05 20:50:00 2020-01-05 22:00:00 night
#7 m3 2020-01-06 06:30:00 2020-01-06 07:40:00 night
#8 m4 2020-01-08 06:30:00 2020-01-08 07:50:00 night
#9 m4 2020-01-08 07:50:00 2020-01-08 08:55:00 mixed
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句