我的时间向量是这样的字符串:
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")
如果时间落在确切的半小时切割点,则会将其重新编码为上一个类别,如上例中的第一个和最后一个重新编码。
知道怎么做到这一点吗?
答案 0 :(得分:3)
library(purrr)
library(dplyr)
time_hour <- c("0000", "0723", "0750", "0751", "1229", "1230")
迭代分裂时间&amp;分钟,使用dplyr
的{{1}}来处理标准和边缘情况&amp;将计算值与单case_when
的组合:
sprintf
答案 1 :(得分:1)
这是我使用lubridate的解决方案。
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"
答案 2 :(得分:0)
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"