Как преобразовать время (мм: сс) в десятичную форму в R - PullRequest
20 голосов
/ 04 марта 2011

Я импортировал csv-файл в R, используя RStudio, где я пытаюсь начислять очки за игру против минут за игру. Тем не менее, количество минут в игре представлено в формате mm: ss, и мне трудно найти способ преобразовать его в десятичную форму.

Пожалуйста, помогите!

Ответы [ 3 ]

25 голосов
/ 04 марта 2011

Учитывая, что вы начинаете с вектора символов, это относительно просто:

minPerGame <- c("4:30","2:20","34:10")

sapply(strsplit(minPerGame,":"),
  function(x) {
    x <- as.numeric(x)
    x[1]+x[2]/60
    }
)

дает

[1]  4.500000  2.333333 34.166667

Убедитесь, что вы проверили, что вы использовали read.csv() с параметром as.is=TRUE. В противном случае вам придется конвертировать, используя as.character().

9 голосов
/ 04 марта 2011

Вам нужно для ее десятичного дробления?Если вы храните данные в правильном формате, например, как объект класса POSIXlt, одного из классов даты и времени R, R будет обрабатывать правильную обработку времени в числовом виде.Вот пример того, что я имею в виду:

Сначала мы создадим фиктивные данные для целей иллюстрации:

set.seed(1)
DF <- data.frame(Times = seq(as.POSIXlt("10:00", format = "%M:%S"), 
                             length = 100, by = 10),
                 Points = cumsum(rpois(100, lambda = 1)))
head(DF)

Игнорируем тот факт, что здесь есть даты, они фактически игнорируются, когда мы делаемсюжет, как и все наблюдения, имеют одинаковую часть даты.Затем мы строим это с использованием интерфейса формулы R:

plot(Points ~ Times, data = DF, type = "o")

, который производит это:

points per game time

2 голосов
/ 04 марта 2011

Некоторые настройки первого решения:

minPerGame <- paste(sample(1:89,100000,T),sample(0:59,100000,T),sep=":")

f1 <- function(){
sapply(strsplit(minPerGame,":"),
 function(x) {
  x <- as.numeric(x)
  x[1]+x[2]/60
 }
)
}
#
f2<- function(){
 w <- matrix(c(1,1/60),ncol=1)
 as.vector(matrix(as.numeric(unlist(strsplit(minPerGame,":"))),ncol=2,byrow=TRUE)%*%w)
}

system.time(f1())
system.time(f2())

system.time (f1 ()) пользовательской системы прошло 0,88 0,00 0,86

system.time (f2 ()) userсистема прошла 0,25 0,00 0,27

...