我有一个时间向量作为字符串:
time_hour <- c("0000", "0723", "0750", "0751", "1229", "1230")
第一个时间点是晚上12:00,最后一个是下午12:30。我想将此矢量重新编码为半小时的类别,例如:
recoded_time <- c("2330-0000", "0700-0730", "0730-0800", "0730-0800", "1200-1230", "1200-1230")
如果时间降落在确切的半小时切点中,则将其重新编码为上一个类别,如上述示例的第一个和最后一个重述。
任何想法如何完成?
library(purrr)
library(dplyr)
time_hour <- c("0000", "0723", "0750", "0751", "1229", "1230")
迭代一小时&amp;分钟,使用dplyr
的case_when
处理标准和边缘案例&amp;将计算值与单个sprintf
's结合在一起:
map2_chr(
as.numeric(substr(time_hour, 1, 2)),
substr(time_hour, 3, 4),
~case_when(
((.x == 0) & (.y == "00")) ~ "2330-0000",
(as.numeric(.y) > 30) ~ sprintf("%02d30-%02d00", .x, (.x+1)),
TRUE ~ sprintf("%02d00-%02d30", .x, .x)
)
)
这是我使用lubriate的解决方案。
library(lubridate)
time_hour <- c("0000", "0723", "0750", "0751", "1229", "1230")
time_hour <- strptime(time_hour,format="%H%M")-1
paste(sprintf('%02d', hour(time_hour)),
sprintf('%02d', floor(minute(time_hour)/30)*30),
'-',
sprintf('%02d', hour(time_hour + 1800)),
sprintf('%02d', floor(minute(time_hour+1800)/30)*30),
sep='')
输出是:
"2330-0000" "0700-0730" "0730-0800" "0730-0800" "1200-1230" "1200-1230"
time_hour <- c("0000", "0723", "0750", "0751", "1229", "1230")
for(t in time_hour){
hour <- as.numeric(substr(t,1,2))
min <- substr(t,3,4)
if(hour == 0 & min == "00"){
out <- "2330-0000"
}else if(as.numeric(min) > 30){
out <- paste(sprintf("%02d",hour),"30", "-", sprintf("%02d",(hour+1)), "00", sep = "")
}else{
out <- paste(sprintf("%02d",hour),"00", "-", sprintf("%02d",(hour)), "30", sep = "")
}
print(out)
}
[1] "2330-0000"
[1] "0700-0730"
[1] "0730-0800"
[1] "0730-0800"
[1] "1200-1230"
[1] "1200-1230"