Преобразование продолжительности поездки в длительность парковки - PullRequest
0 голосов
/ 07 марта 2020

У меня есть данные о продолжительности поездки в несколько сотен тысяч человек, и я хочу преобразовать таблицу продолжительности поездки в продолжительность парковки для каждого человека в новом кадре данных, как показано на рисунке. Есть ли возможность сделать в R? Это может быть легко, но, поскольку я новичок в R, я много борюсь. Любая помощь приветствуется.

enter image description here

1 Ответ

1 голос
/ 07 марта 2020

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

Этот подход не обязательно самый быстрый, но может работать для вас. Добавленные строки зависят от предыдущего end_time и следующего ряда start_time.

. Он добавляет полночь до и после ваших данных для каждого ID, включая интервалы времени с полуночью.

library(dplyr)

result <- data.frame(ID = as.numeric(),
                     start = as.POSIXct(character()),
                     end = as.POSIXct(character()))

df$start_time <- as.POSIXct(df$start_time, format = "%H:%M")
df$end_time <- as.POSIXct(df$end_time, format = "%H:%M")

first_time <- as.POSIXct("00:00", format = "%H:%M")
last_time <- as.POSIXct("24:00", format = "%H:%M")

for (i in unique(df$ID)) {
  sub_i <- bind_rows(
    data.frame(ID = i, start_time = first_time, end_time = first_time),
    subset(df, ID == i),
    data.frame(ID = i, start_time = last_time, end_time = last_time)
  )
  adding <- data.frame(ID = i, start = sub_i$end_time[-nrow(sub_i)], end = sub_i$start[-1])
  adding <- adding[adding$start <= adding$end, ]
  result <- bind_rows(result, adding)
}

result$start <- format(result$start, "%H:%M")
result$end <- format(result$end, "%H:%M")

result[order(result$ID, result$start), c("ID", "start", "end")]

Выход

    ID start   end
1 2353 00:00 06:00
2 2353 06:30 11:20
3 2353 12:00 16:00
4 2353 16:30 00:00
5 3232 00:00 07:00
6 3232 07:45 18:00
7 3232 18:45 00:00

Данные

df <- data.frame(
  ID = c(2353,2353,2353,3232,3232),
  start_time = c("6:00", "11:20", "16:00", "7:00", "18:00"),
  end_time = c("6:30", "12:00", "16:30", "7:45", "18:45")
)

Редактировать :

Оставим в старом коде пока, пока мы не сможем подтвердить, что это работает.

Я не уверен, что вы используете для чтения файла Excel, но здесь я использовал readxl.

После прочтения файла он уже находится в формате POSIXct, поэтому я закомментировал эти строки. Дата происхождения 1899-12-31. Я добавил UTC часовой пояс, чтобы соответствовать здесь.

Дайте мне знать, если это работает.

library(dplyr)
library(readxl)

df <- readxl::read_xlsx("pkw_r_R.xlsx")

# df <- data.frame(
#   ID = c(2353,2353,2353,3232,3232,4100),
#   start_time = c("6:00", "11:20", "16:00", "7:00", "18:00", "05:00"),
#   end_time = c("6:30", "12:00", "16:30", "7:45", "18:45", "00:00")
# )

result <- data.frame(hp_id = as.numeric(),
                     start = as.POSIXct(character()),
                     end = as.POSIXct(character()))

# df$start_time <- as.POSIXct(df$start_time, format = "%H:%M")
# df$end_time <- as.POSIXct(df$end_time, format = "%H:%M")

first_time <- as.POSIXct("1899-12-31 00:00", format = "%Y-%m-%d %H:%M", tz = "UTC")
last_time <- as.POSIXct("1899-12-31 24:00", format = "%Y-%m-%d %H:%M", tz = "UTC")

for (i in unique(df$hp_id)) {
  sub_i <- bind_rows(
    data.frame(hp_id = i, st_time = first_time, end_time = first_time),
    subset(df, hp_id == i),
    data.frame(hp_id = i, st_time = last_time, end_time = last_time)
  )
  print(i)
  adding <- data.frame(hp_id = i, start = sub_i$end_time[-nrow(sub_i)], end = sub_i$st_time[-1])
  adding <- adding[adding$start <= adding$end, ]
  result <- bind_rows(result, adding)
}

result$start <- format(result$start, "%H:%M")
result$end <- format(result$end, "%H:%M")

result[order(result$hp_id, result$start), c("hp_id", "start", "end")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...