I think the most robust method would be to convert the dates and times into datetimes (rather than strings) with strptime (or something similar from lubridate). At this point you can then convert to any format you'd like, including 24 hour time.
See example:
library(tidyverse)
times <- tibble::tribble(
~date, ~day, ~time, ~am_or_pm,
"1/1/18", "Mon", "9:23", "AM",
"1/1/18", "Mon", "4:02", "PM",
"1/1/18", "Mon", "10:01", "PM",
)
# For datetime formats see: https://www.stat.berkeley.edu/~s133/dates.html
times %>%
mutate(datetime_str = paste(date, time, am_or_pm),
datetime = as.POSIXct(strptime(datetime_str, format = "%d/%m/%y %I:%M %p")),
datetime_military = strftime(datetime, format = "%Y-%m-%d %H:%M")) %>%
select(-datetime_str) # Trim output...
#> # A tibble: 3 x 6
#> date day time am_or_pm datetime datetime_military
#> <chr> <chr> <chr> <chr> <dttm> <chr>
#> 1 1/1/18 Mon 9:23 AM 2018-01-01 09:23:00 2018-01-01 09:23
#> 2 1/1/18 Mon 4:02 PM 2018-01-01 16:02:00 2018-01-01 16:02
#> 3 1/1/18 Mon 10:01 PM 2018-01-01 22:01:00 2018-01-01 22:01