根据我之前的问题,我想在给定智能卡数据的情况下计算托管(即两个人同时出现)实例。这是一个由十条记录组成的虚构样本:
library(lubridate)
smartcard <- c(1,2,3,2,1,2,4,4,1,1)
boarding_stop <- c("C23", "C14", "C23", "C23", "C23", "C14", "C14", "C23", "C14", "C23")
boarding_time <- as.times(c("07:24:01", "07:26:18", "07:37:19", "08:29:22", "08:34:10", "15:55:23",
"16:20:22", "17:07:31", "17:13:34", "17:35:52"))
colocation <- data.frame(smartcard, boarding_time, boarding_stop)
colocation
smartcard boarding_time boarding_stop
1 1 07:24:01 C23
2 2 07:26:18 C14
3 3 07:37:19 C23
4 2 08:29:22 C23
5 1 08:34:10 C23
6 2 15:55:23 C14
7 4 16:20:22 C14
8 4 17:07:31 C23
9 1 17:13:34 C14
10 1 17:35:52 C23
给定 30 分钟的托管缓冲区(即 07:24 到达的乘客 1 将在07:54之前到达时与另一位乘客一起托管),我想记录成对乘客满足此条件的所有实例,并记录boarding_stop
, boarding_time
,和他们的smartcard
身份证。
例如,我会发现乘客 1 和 3C23
位于 07:37:19。最终,我想要表单的输出
boarding_stop boarding_time smartcard1 smartcard2
C23 07:37:19 1 3
C23 08:34:10 2 1
C23 07:35:52 4 1
C14 16:20:22 2 4
我之前的尝试是编写几个for
循环来查找单独的旅行信息对,并确定两次旅行是否在半小时内记录在火车站。一旦找到,然后附加一个新行,其中包含有关时间、智能卡乘客和位置的信息。
Output<- read.table(text = "boarding_stop boarding_time smartcard1 smartcard2", header = TRUE)
for s in unique(colocaion$boarding_stop):
for i in 1:nrow(colocation):
for j in 1:nrow(colocation):
if colocation$boarding_time[[j,2]] <= colocation$boarding_time[[i,2]] + "00:30:00" &
colocation$boarding_time[[j,2]] >= colocation$boarding_time[[i,2]]:
Output %>% add_row(boarding_stop = colocation$boarding_stop[[j,3]],
boarding_time = colocation$boarding_time[[j,2]],
smartcard1 = colocation$smartcard[[i,1]],
smartcard2 = colocation$smartcard[[j,1]])
end
end
end
我最初使用的方法dplyr
是group_by
首先对独特的电台进行分组。但是由于每对行程的半小时缓冲时间都在变化,我认为我不能简单mutate
地summarise
捕获colocation。我感谢@Matt 在之前的问题中的回答。对此的任何帮助将不胜感激。