Расчет времени проведенного с датами и форматом времени в г - PullRequest
1 голос
/ 31 января 2020

Я работаю над переменной время / дата и пытаюсь оценить время, затраченное на каждую запись. Я следую за двумя шагами для этого анализа. (a) изменить переменные в нужном формате (b) рассчитать время, затраченное на каждый вопрос. Вот как выглядит мой набор данных:

id <-     c(1,1,1,1,1, 2,2,2,2,2)
item.id <- c(1,2,3,4,5, 1,2,3,4,5)
submit.time <-c("2019-04-09 09:50:30.340","2019-04-09 09:52:12.440","2019-04-09 09:52:15.787","2019-04-09 09:53:21.587","2019-04-09 09:53:49.047",
                "2019-04-09 09:49:45.243","2019-04-09 09:52:53.663","2019-04-09 09:53:23.293","2019-04-09 09:54:00.727","2019-04-09 09:54:52.400")
start.time <- c("04/09/2019 09:50:02.317 AM","04/09/2019 09:50:02.317 AM","04/09/2019 09:50:02.317 AM","04/09/2019 09:50:02.317 AM","04/09/2019 09:50:02.317 AM",
                "04/09/2019 09:47:42.583 AM","04/09/2019 09:47:42.583 AM","04/09/2019 09:47:42.583 AM","04/09/2019 09:47:42.583 AM","04/09/2019 09:47:42.583 AM")

data <- data.frame(id, item.id,start.time, submit.time)

> data
   id item.id                 start.time             submit.time
1   1       1 04/09/2019 09:50:02.317 AM 2019-04-09 09:50:30.340
2   1       2 04/09/2019 09:50:02.317 AM 2019-04-09 09:52:12.440
3   1       3 04/09/2019 09:50:02.317 AM 2019-04-09 09:52:15.787
4   1       4 04/09/2019 09:50:02.317 AM 2019-04-09 09:53:21.587
5   1       5 04/09/2019 09:50:02.317 AM 2019-04-09 09:53:49.047
6   2       1 04/09/2019 09:47:42.583 AM 2019-04-09 09:49:45.243
7   2       2 04/09/2019 09:47:42.583 AM 2019-04-09 09:52:53.663
8   2       3 04/09/2019 09:47:42.583 AM 2019-04-09 09:53:23.293
9   2       4 04/09/2019 09:47:42.583 AM 2019-04-09 09:54:00.727
10  2       5 04/09/2019 09:47:42.583 AM 2019-04-09 09:54:52.400

id для каждого студента, item.id - идентификатор вопроса, start.time - время входа на экзамен (уникальное время для каждого студента). ), а submit.time - это время, когда студент представляет ответ на каждый вопрос.

(a) редактирование данных: этот шаг включает удаление AM|PM и переключение порядка start.time, потому что я хотел бы использовать формат submit.time и отредактированный формат start.time ,

data$start.time <- gsub(" AM| PM", "", data$start.time) # exclude AM or PM
data$start.time <- gsub("/", "-", data$start.time) #replace / with -
dtparts = t(as.data.frame(strsplit(data$start.time,' '))) # split date and time
row.names(dtparts) = NULL
data$newdate <- strptime(as.character(dtparts[,1]), "%m-%d-%Y") # switch the date order
data$newdate <- as.POSIXct(data$newdate) # R was complaining about the time format-had to change here
data$start.time <- paste0(data$newdate," ",dtparts[,2]) # bring the time back

Теперь переменные с двумя временными характеристиками выглядят одинаково. Я преобразовал эти даты и время в секунды.

data %>%
  mutate(start.time.num = as.numeric(as.POSIXct(start.time), units="secs"))  %>%
  mutate(submit.time.num = as.numeric(as.POSIXct(submit.time), units="secs"))

   id item.id              start.time             submit.time    newdate start.time.num submit.time.num
1   1       1 2019-04-09 09:50:02.317 2019-04-09 09:50:30.340 2019-04-09     1554817802      1554817830
2   1       2 2019-04-09 09:50:02.317 2019-04-09 09:52:12.440 2019-04-09     1554817802      1554817932
3   1       3 2019-04-09 09:50:02.317 2019-04-09 09:52:15.787 2019-04-09     1554817802      1554817936
4   1       4 2019-04-09 09:50:02.317 2019-04-09 09:53:21.587 2019-04-09     1554817802      1554818002
5   1       5 2019-04-09 09:50:02.317 2019-04-09 09:53:49.047 2019-04-09     1554817802      1554818029
6   2       1 2019-04-09 09:47:42.583 2019-04-09 09:49:45.243 2019-04-09     1554817663      1554817785
7   2       2 2019-04-09 09:47:42.583 2019-04-09 09:52:53.663 2019-04-09     1554817663      1554817974
8   2       3 2019-04-09 09:47:42.583 2019-04-09 09:53:23.293 2019-04-09     1554817663      1554818003
9   2       4 2019-04-09 09:47:42.583 2019-04-09 09:54:00.727 2019-04-09     1554817663      1554818041
10  2       5 2019-04-09 09:47:42.583 2019-04-09 09:54:52.400 2019-04-09     1554817663      1554818092

(b) На этом шаге я хотел бы рассчитать время, затраченное на каждый вопрос здесь. Для первого вопроса первого студента время должно быть submit.time.num(1554817830) - start.time.num(1554817802)=28. Для второго вопроса первого ученика время должно быть submit.time.num(1554817932) - предыдущее submit.time.num(1554817830)=102. Эту процедуру необходимо повторить для каждого студента. Когда он попадает ко второму студенту, он должен снова взять start.time для первого ряда второго студента.

Итак, дополнительный столбец должен выглядеть следующим образом:

> time.spent
   time.spent
1          28
2         102
3           4
4          66
5          27
6         122
7         189
8          29
9          38
10         51

Я прошу прощения за публикацию так долго, если у вас также есть какие-либо предложения для первой части, пожалуйста, дайте мне знать, что более важно Любые предложения по части (b)?

Спасибо

1 Ответ

2 голосов
/ 31 января 2020

Это можно сделать немного быстрее в одном конвейере.

library(dplyr)
data %>%
  mutate(
    start.time = as.POSIXct(start.time, format = "%m/%d/%Y %H:%M:%OS"),
    submit.time = as.POSIXct(submit.time),
    time.spent = difftime(submit.time, start.time, units = "secs")
  ) %>%
  group_by(id) %>%
  mutate(
    time.spent = c(time.spent[1], diff(time.spent))
  ) %>%
  ungroup()
# # A tibble: 10 x 5
#       id item.id start.time          submit.time         time.spent  
#    <dbl>   <dbl> <dttm>              <dttm>              <drtn>      
#  1     1       1 2019-04-09 09:50:02 2019-04-09 09:50:30  28.023 secs
#  2     1       2 2019-04-09 09:50:02 2019-04-09 09:52:12 102.100 secs
#  3     1       3 2019-04-09 09:50:02 2019-04-09 09:52:15   3.347 secs
#  4     1       4 2019-04-09 09:50:02 2019-04-09 09:53:21  65.800 secs
#  5     1       5 2019-04-09 09:50:02 2019-04-09 09:53:49  27.460 secs
#  6     2       1 2019-04-09 09:47:42 2019-04-09 09:49:45 122.660 secs
#  7     2       2 2019-04-09 09:47:42 2019-04-09 09:52:53 188.420 secs
#  8     2       3 2019-04-09 09:47:42 2019-04-09 09:53:23  29.630 secs
#  9     2       4 2019-04-09 09:47:42 2019-04-09 09:54:00  37.434 secs
# 10     2       5 2019-04-09 09:47:42 2019-04-09 09:54:52  51.673 secs

Используя предложение @ akrun, мы можем немного сократить код:

data %>%
  group_by(id) %>%
  mutate(
    start.time = as.POSIXct(start.time, format = "%m/%d/%Y %H:%M:%OS"),
    submit.time = as.POSIXct(submit.time),
    time.spent = submit.time - lag(submit.time, default = first(start.time))
  ) %>%
  ungroup()

(и при желании удалить столбцы, которые вам больше не нужны).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...