Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将行程持续时间转换为停车持续时间_R_Dataframe - Fatal编程技术网

R 将行程持续时间转换为停车持续时间

R 将行程持续时间转换为停车持续时间,r,dataframe,R,Dataframe,我有一个几十万人的旅行持续时间数据,我想做的是将旅行持续时间表转换为新数据框中每个人的停车持续时间,如图所示。在R中有可能的方法吗?这可能很容易,但因为我是R的新手,所以我很挣扎。感谢您的帮助 如果您将时间转换为POSIXct,它将添加日期,尽管在提供最终结果之前可以删除这些日期 这种方法不一定是最快的,但可能适合您。添加的行取决于上一行的结束时间和下一行的开始时间 它为每个ID添加数据前后的午夜,以包括午夜的时间间隔 library(dplyr) result <- data.fram

我有一个几十万人的旅行持续时间数据,我想做的是将旅行持续时间表转换为新数据框中每个人的停车持续时间,如图所示。在R中有可能的方法吗?这可能很容易,但因为我是R的新手,所以我很挣扎。感谢您的帮助


如果您将时间转换为
POSIXct
,它将添加日期,尽管在提供最终结果之前可以删除这些日期

这种方法不一定是最快的,但可能适合您。添加的行取决于上一行的结束时间和下一行的开始时间

它为每个
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")]
数据

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")
)
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")
)
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")]