У меня есть большой фрейм данных, который выглядит так:
я хочу, чтобы столбец времени в пути показывал время в пути в минутах, например:
Я попробовал функцию hm()
, но она не работает со значениями меньше 1 часа.
Попробуйте обернуть преобразование времени во вложенных заменах строк:
#Code
df$NewTime <- unname(sapply(sub('s','',sub("\\s+min",
"", sub("hour|hours", "* 60 +", df$traveltime))),
function(x) eval(parse(text=x))))
Выход:
df
from to distance.in.km traveltime NewTime
1 1033 1076 1.8 6 mins 6
2 1035 1076 2.6 1 min 1
3 1036 1076 2.4 1 hour 26 mins 86
4 1037 1076 6.7 3 hours 1 min 181
Некоторые используемые данные:
#Data
df <- structure(list(from = c(1033L, 1035L, 1036L, 1037L), to = c(1076L,
1076L, 1076L, 1076L), distance.in.km = c(1.8, 2.6, 2.4, 6.7),
traveltime = c("6 mins", "1 min", "1 hour 26 mins", "3 hours 1 min"
)), row.names = c(NA, -4L), class = "data.frame")
Другой вариант использования stringr
:
library(stringr)
#Code 2
df$NewTime <- sapply(str_extract_all(df$traveltime, "\\d+"), function(x) {
x1 <- as.numeric(x)
if (length(x1)>1) x1[1]*60 + x1[2] else x1 })
Он будет производить тот же результат.
Другим решением может быть извлечение числовых подстрок. Сначала занесите числа в список, а затем переведите часы в минуты, умножив 60.
matches <- regmatches(df$traveltime, gregexpr("[[:digit:]]+", df$traveltime))
hr_mins <- lapply(matches, function(x){
x <- as.numeric(x)
if (length(x) > 1) x[1] * 60 + x[2] else x
})
df$traveltime <- unlist(hr_mins)
Выход
from to distance.in.km traveltime
1 1033 1076 1.8 6
2 1035 1076 2.6 1
3 1036 1076 2.4 86
4 1037 1076 6.7 181
Данные
df <- structure(list(from = c(1033, 1035, 1036, 1037), to = c(1076,
1076, 1076, 1076), distance.in.km = c(1.8, 2.6, 2.4, 6.7), traveltime = c("6 mins",
"1 min", "1 hour 26 mins", "3 hours 1 min")), class = "data.frame", row.names = c(NA,
-4L))
Вы можете преобразовать traveltime
в объект lubridate
period
, преобразовать объект периода в количество секунд и разделить его на 60, чтобы получить продолжительность в минутах.
library(lubridate)
df$travel_min <- period_to_seconds(period(df$traveltime))/60
df
# from to distance.in.km traveltime travel_min
#1 1033 1076 1.8 6 mins 6
#2 1035 1076 2.6 1 min 1
#3 1036 1076 2.4 1 hour 26 mins 86
#4 1037 1076 6.7 3 hours 1 min 181