2016-12-20 2 views
1

У меня есть набор данных, который содержит время событий в футболе. Игра превышает 60 минут, и я пытаюсь рассчитать интервалы. Это данные, у меня есть:Время вычитания, превышающее 60 минут

data <- c("11:14", "17:27", "25:34", "39:17", "39:59", "42:32", "50:15", "50:53", "64:22", "67:39") 

Моя проблема возникает из-за того, что минут превышать 60 (они могут находиться в пределах от 0 до 90 минут). Таким образом, по существу, я хотел бы код, который будет распечатывать интервалы между событиями:

"6:13", "8:07", "13:43",..., "3:17" 

было бы лучше, чтобы преобразовать данные в часы, а затем идти оттуда? Просто идея, которую я должен был сделать легче. Я смотрел на другие вопросы, но я не мог найти того, что было задано для Р. Если это так, и я пропустил его, не стесняйтесь критиковать, но, пожалуйста, соедините мне дубликат.

Заранее благодарен!

ответ

2

Посмотрите на lubridate для такого рода вещей.

Там, наверное, простой способ сделать это, но это работает:

library(lubridate) 
data <- c("11:14", "17:27", "25:34", "39:17", "39:59", "42:32", "50:15", "50:53", "64:22", "67:39") 
out <- seconds_to_period(diff(as.numeric(ms(data))) 

Если вы хотите, чтобы вывод в виде отформатированной строки вместо периода, используйте Sprintf:

sprintf('%02d:%02d', minute(out), second(out)) 
1

Это может работать слишком

data1 <- c("11:14", "17:27", "25:34", "39:17", "39:59", "42:32", "50:15", "50:53", "64:22", "67:39") 
data2 = sapply(strsplit(data1,":"), # from http://stackoverflow.com/a/5187350/7128934 
       function(x) { 
        x <- as.numeric(x) 
        x[1]+x[2]/60 
       } 
) 

difference = list() 
for (i in 1: (length(data1) - 1)) { 
difference[i] = data2[i+1] - data2[i] 
} 
+0

Родственный метод для вычисления разницы в секундах является 'secDiffs <- Diff (sapply (strsplit (данные, сплит = ":"), функция (х) сумма (as.integer (х) * C (60L , 1L)))) '. – lmo

0

Другая база R попытка использования as.difftime указать единицы в явном виде:

out <- diff(sapply(strsplit(data, ":"), function(x) 
    Reduce(`+`, Map(as.difftime, as.numeric(x), units=c("mins","secs")))) 
) 

# time difference in seconds 
out 
#[1] 373 487 823 42 153 463 38 809 197 

# formatted string 
sprintf("%d:%02d", out %/% 60, out %% 60) 
#[1] "6:13" "8:07" "13:43" "0:42" "2:33" "7:43" "0:38" "13:29" "3:17" 
Смежные вопросы