2017-09-28 3 views
0

Comment convertir une colonne avec les deux minutes et des heures à un int décrivant minutes comme une df avecR: Comment convertir min (string) int

df $ durée = [ "1 h 10 min", "120 min", ...]

duration 
---------- 
1 h 10 min 
120 min 

à

df $ durée = [70, 120, ...]

result 
------ 
70 
120 

Répondre

1

est ici une option:

library(stringr) 

d = c("1 h 10 min", "120 min", "2 h", "12 h 53 min") 

na_to_0 = function(x) {x[is.na(x)] = 0; x} 

to_minutes = function(s) { 

    hr = na_to_0(60 * as.numeric(str_replace(str_extract(s, "[0-9]{1,2} h"), " h", ""))) 
    min = na_to_0(as.numeric(str_replace(str_extract(s, "[0-9]{1,3} min"), " min", ""))) 

    hr + min 
} 

to_minutes(d) 

[1] 70 120 120 773

1
duration = c("1 h 10 min", "120 min") 
sapply(strsplit(duration, " "), function(x){ 
    temp = as.numeric(x) 
    if (length(temp) == 4){ 
     sum(as.numeric(temp[c(1, 3)]) * c(60, 1)) 
    }else{ 
     as.numeric(temp[1]) 
    } 
    }) 
#[1] 70 120 
#Warning messages: 
#1: In FUN(X[[i]], ...) : NAs introduced by coercion 
#2: In FUN(X[[i]], ...) : NAs introduced by coercion 
2

Utilisez le package lubridate, mais vous devez nettoyer les données un peu en obtenant toutes les valeurs dans un format cohérent.

> df <- data.frame(duration=c("1 h 10 min","120 min"), stringsAsFactors = F) 
> no_h<-!grepl("h", df$duration) 
> df$duration[no_h] <- paste("0 h", df$duration[no_h]) 
> df$period <-hm(df$duration) 
> df$minute <- hour(df$period)*60 + minute(df$period) 
> df 
    duration period minute 
1 1 h 10 min 1H 10M 0S  70 
2 0 h 120 min 120M 0S 120 
>