Dado este marco de datos

row | time | name
-----------------
1   | 2 min| bob
2   | 7 min| john
3   | 1 hr 5 min| jess

Quiero procesar la columna de tiempo en una columna numérica que contenga el número de minutos. Tengo una función para procesar la cadena en un número, pero cuando trato de apply mutar / transformar el marco de datos original, data.frame(apply(dataframe, 2, parse_str)), falla o simplemente no funciona. Una vez que pueda aplicar la función de transformación, planeo convertir la columna de caracteres a numérica a través de df = as.numeric(as.character(dataframe$time)), pero aún no la he probado.

¿Alguna idea sobre cómo puedo hacer que mi función de preprocesamiento mute / transforme / cree correctamente un nuevo marco de datos?

1
James L. 14 feb. 2018 a las 00:02

2 respuestas

La mejor respuesta

Como han dicho los comentarios, es mejor hacerlo sin apply:

> df <- data.frame(time=c('2 min', '7 min', '1 hr 5 min'), name = c('bob', 'john', 'jess'))
> df
        time name
1      2 min  bob
2      7 min john
3 1 hr 5 min jess
> df$time <- as.numeric(parse_str(df$time))
> df
        time name
1          2  bob
2          7 john
3         65 jess

Si su función parse_str devuelve numérico como dice, entonces ni siquiera necesita la llamada as.numeric.

2
C. Braun 13 feb. 2018 a las 21:14

Aquí hay otra opción que usa y , para cualquier persona que quiera reproducir sus resultados, pero no tiene tu función. Usando la fecha de la respuesta de C. Braun,

# install.packages(c("tidyverse", "lubridate"), dependencies = TRUE)
library(tidyverse)
library(lubridate)

df %>% mutate(
            `t formated` = str_replace(time, "(^[0-9] min)", "0 hr \\1"),
            `t hours minues` = hm(`t formated`),
            `t duration` = as.duration(`t hours minues`),
            `t numeric` = as.numeric(`t duration`, "minutes")
            ) %>% as_tibble()
#> # A tibble: 3 x 6
#>         time   name `t formated` `t hours minues`        `t duration` `t numeric`
#>       <fctr> <fctr>        <chr>     <S4: Period>      <S4: Duration>       <dbl>
#> 1      2 min    bob   0 hr 2 min            2M 0S   120s (~2 minutes)           2
#> 2      7 min   john   0 hr 7 min            7M 0S   420s (~7 minutes)           7
#> 3 1 hr 5 min   jess   1 hr 5 min         1H 5M 0S 3900s (~1.08 hours)          65
1
Eric Fail 14 feb. 2018 a las 13:46