Tengo algunos valores de tiempo que intento discretizar según 3 categorías: mañana (4.30, 12.00), tarde (12.00, 21.00), noche (21.00, 4.30)

Primero estoy tratando de convertir el vector de caracteres en un carácter usando lubridate

library(lubridate)
h <- hm(c("14:30", "02:10", "06:30", "14:50", "20:30", "21:00", "12:00", "23:30", "08:10", "00:00"))

Ahora necesito discretizar h.

Normalmente usaría cut, pero no parece funcionar aquí:

cut(h, breaks = hm(c('4.30', '12.00', '21.00')), levels = c('morning', 'evening', 'night'))

¿Hay una función específica en lubridate?

1
Dambo 7 mar. 2018 a las 07:14

3 respuestas

La mejor respuesta

Podemos convertirlo en objeto times

library(chron)
t1 <- times(paste0(v1, ":00"))

Y luego haga cut especificando breaks como times

cut(t1, breaks = times(c('04:30:00', '12:00:00', 
            '21:00:00', '21:00:01')), labels = c('morning', 'evening', 'night'))
#[1] evening <NA>    morning evening evening evening morning <NA>    morning <NA>   
#Levels: morning evening night

#Levels: morning evening night

O esto se puede hacer con strptime de base R

res <- cut(strptime(v1, format = "%H:%M"), breaks = strptime(c("04:30", "12:00", 
   "21:00", "21:01"), format = "%H:%M"), 
   labels = c("morning", "evening", "night"))
res[is.na(res)] <- "night"
res
#[1] evening night   morning evening evening night   evening night   morning night  
#Levels: morning evening night

Datos

v1 <- c("14:30", "02:10", "06:30", "14:50", "20:30",
            "21:00", "12:00", "23:30", "08:10", "00:00")    
2
akrun 7 mar. 2018 a las 04:48

Puede usar findInterval desde la base R:

breaks=strptime(c("0.00","4.00","12.00","21.00","23.59"),"%H.%M")
labels=c("night","morning","evening","night")
labels[findInterval(strptime(dat,"%H:%M"),breaks)]
 [1] "evening" "night"   "morning" "evening" "evening" "night"   "evening"
 [8] "night"   "morning" "night"  

Dónde

 dat <- c("14:30", "02:10", "06:30", "14:50", "20:30",
        "21:00", "12:00", "23:30", "08:10", "00:00")    

Podemos ver que dat 2 ha recibido night

1
Onyambu 7 mar. 2018 a las 04:56

Otra opción es convertir los tiempos en números, y luego puede usar la función discretizar en arules. Esto puede ser flexible y usarse con fechas, etc.

require(arules)
h <- data.frame(V1=(c("14:30", "02:10", "06:30", "14:50", "20:30", "21:00", "12:00", "23:30", "08:10", "00:00")))
h$V2<- gsub("\\:", "", h$V1)
h$discrete=discretize(h$V2,method="fixed",categories=c(0,1430,1200,2100,Inf))
1
Richard N. Belcher 19 mar. 2018 a las 09:28