r - Changing multiple columns of a data frame from class 'character' to class 'time' using chron -


i have data frame multiple columns, of need change 'time' class using chron can retrieve basic statistics. these columns times stored characters , formatted this: hh:mm.

here subset of list of columns need change:

    > data      date flt type    reg   ac  dep  arr   std   sta   atd   ata 1 15-01-02 953   j  c-gcpt 73m  yvq  yev  12:00 12:55 13:00 13:59 2 15-01-04 953   j  c-gcpt 73m  yvq  yev  12:00 12:55 13:17 14:13 3 15-01-05 953   j  c-gcpt 73m  yvq  yev  12:00 12:55 13:20 14:14  time_list <-c("std","sta","atd","ata") 

here have done change 1 column (and works):

    data$ata <- paste0(data$ata, ':00')     data$ata<-chron(times.=data$ata)      class(data$ata)     [1] "times" 

however, prefer able columns @ same time since there many of them. i've tried multiple techniques , seem work first part, pasting ':00', goes wrong second part, using chron . seem have length problem don't understand

  1. using dmap

    data[,time_list]<-   data%>%   select(one_of(time_list)) %>%   dmap(paste0,':00')  data[,time_list]<-   data %>%   select(one_of(time_list)) %>%   dmap(chron,times.=data[,time_list])  **error in .f(.d[[i]], ...) :    .d[[i]] , data[, time_list] must have equal lengths** 
  2. using apply

    yevdata[,(time_list)] <- lapply(yevdata[,(time_list)], paste0,':00') data[,(time_list)] <- lapply(data[,(time_list)], chron, times. =data[,(time_list)]) **error in fun(x[[i]], ...) :    x[[i]] , data[, (time_list)] must have equal lengths** 
  3. using forloop

i tried using loop, i'm beginner , anywhere.

  1. using "simple" solution stack overflow question.

it made mess, pasting.

efficiently transform multiple columns of data frame

any ideas in plain beginner language appreciated! if possible nest both operations, better!

dplyr::mutate_at work situation. define variables want mutate , define function want use.

you can pasting , converting time in single step within funs using . notation , nesting functions.

library(dplyr) data = mutate_at(data, time_list, funs(chron(times. = paste0(., ":00")))) 

Comments