У меня есть data.frame
, который выглядит следующим образом (экспорт для проб в конце вопроса):
vehicleRefId dep_time trav_time start_link end_link arr_time
1 10 39956 119 270549 937360 40075
2 10 41756 413 937360 212265 42169
3 10 42656 565 212265 184658 43221
4 10 47156 184 184658 357020 47340
5 10 49556 506 357020 976840 50062
6 10 50156 787 976840 132606 50943
7 10 55556 1177 132606 708563 56733
8 10 56156 210 708563 568677 56366
9 10 61556 2965 568677 270549 64521
10 1000157 25473 1940 557064 336850 27413
11 1000157 47114 136 336850 141230 47250
12 1000157 60014 934 141230 545278 60948
13 1000183 26639 1543 592921 655099 28182
14 1000183 73014 622 656482 815987 73636
15 1000183 79506 1290 815987 545278 80796
Моя цель - получить data.frame
, который говорит мне, с какого времени arr_time
и как долго duration
(dep_time[row=n+1] - arr_time[row=n]
) транспортное средство находится на link
.
Сложность заключается в том, что операцию по извлечению этой информации необходимо выполнять для каждого vehicleRefId
в отдельности и соответствующий первый и последний ряд необходимо обрабатывать иначе, чем средние ряды.
Первая строка в vehicleRefId
, ссылка для извлечения - start_link
, а время извлечения - dep_time
. Затем первая строка должна обрабатываться как средняя строка (подробности режима в желаемом выводе ниже).
Для последней строки мне нужно end_link
, а для продолжительности - дельта max(df$arr_time)
и arr_time
.
Требуемый вывод:
link arr_time duration
1 270549 0 40075 #first row: start_link | 0 | dep_time
2 937360 40075 1681 #middle rows: end_link |arr_time | dep_time of next row - current row arr_time
3 212265 42169 2094
4 184658 43221 1052
...
10 270549 64521 52006 #last row: end_link |arr_time| max(arr_time)-arr_time
11 557064 0 25473 #first row: start_link | 0 | dep_time
12 336850 27413 19701 #middle rows: end_link |arr_time | dep_time of next row - current row arr_time
...
Данные для проверки:
structure(list(vehicleRefId = c(10L, 10L, 10L, 10L, 10L, 10L,
10L, 10L, 10L, 1000157L, 1000157L, 1000157L, 1000183L, 1000183L,
1000183L, 1000252L, 1000252L, 1000567L, 1000567L, 1000568L, 1000568L,
1000568L, 1000568L, 100060L, 100060L, 100060L, 100060L, 100060L,
100060L, 100060L, 100061L, 100061L, 1000670L, 1000670L, 1000670L,
1000928L, 1000928L, 100098L, 100098L, 100098L, 100098L, 100099L,
100099L, 1000999L, 1000999L, 1000999L, 1001004L, 1001004L, 1001004L,
1001004L, 1001005L, 1001005L, 100102L, 100102L, 100103L, 100103L,
1001046L, 1001046L, 1001046L, 1001090L, 1001090L, 1001090L, 1001090L,
1001090L, 1001090L, 1001174L, 1001174L, 1001232L, 1001232L, 100126L,
100126L, 100126L, 100126L, 100126L, 100126L, 100126L, 100126L,
100128L, 100128L, 100128L, 100128L, 100128L, 1001313L, 1001313L,
1001313L, 1001313L, 1001313L, 1001313L, 1001313L, 1001313L, 1001349L,
1001349L, 1001388L, 1001388L, 1001456L, 1001456L, 100149L, 100149L,
100149L, 100150L, 100150L, 1001541L, 1001541L, 1001541L, 1001565L,
1001565L, 1001565L, 1001768L, 1001768L, 1001787L, 1001787L, 1001787L,
1001957L, 1001957L, 1001957L, 1001957L, 1001957L, 1001957L, 1001995L,
1001995L, 1002L, 1002L, 1002L, 1002060L, 1002060L, 100222L, 100222L,
1002277L, 1002277L, 1002277L, 1002279L, 1002279L, 1002279L, 1002279L,
10024L, 10024L, 10024L, 10024L, 10024L, 10024L, 1002404L, 1002404L,
1002443L, 1002443L, 100254L, 100254L, 100254L, 100254L, 100254L,
100254L, 100254L, 1002576L, 1002576L, 10026L, 10026L, 10026L,
10026L, 10026L, 1002607L, 1002607L, 100277L, 100277L, 1002772L,
1002772L, 100284L, 100284L, 100284L, 100284L, 100284L, 100284L,
100284L, 1002844L, 1002844L, 1002844L, 1002844L, 1002871L, 1002871L,
1002938L, 1002938L, 1002938L, 1002938L, 1002938L, 1003015L, 1003015L,
10031L, 10031L, 10031L, 10031L, 10032L, 10032L, 10032L, 1003414L,
1003414L, 100352L, 100352L, 1003611L, 1003611L, 1003699L, 1003699L,
1003699L), dep_time = c(39956, 41756, 42656, 47156, 49556, 50156,
55556, 56156, 61556, 25473, 47114, 60014, 26639, 73014, 79506,
64194, 66047, 80817, 80901, 27402, 31547, 36647, 43847, 30627,
36927, 43227, 44187, 46827, 65727, 67527, 51986, 56595, 21346,
67159, 72774, 21263, 60858, 31959, 37359, 39759, 41559, 61889,
74682, 21065, 21261, 56661, 22111, 22362, 59409, 59494, 32070,
63829, 26169, 59769, 53159, 57026, 69595, 71304, 72284, 17744,
17995, 52236, 59460, 60499, 60584, 28153, 41635, 33821, 64393,
33929, 35729, 36449, 48329, 50594, 52829, 62122, 62231, 27002,
27122, 54902, 67502, 70202, 26021, 26787, 45267, 56712, 59667,
63867, 74067, 77067, 20674, 41721, 21935, 56252, 44903, 48563,
25796, 26876, 69896, 57837, 72620, 30899, 30997, 31311, 53403,
58235, 63635, 48169, 76477, 51616, 66370, 67270, 26978, 27230,
27333, 59126, 59513, 59608, 24985, 62204, 28491, 29787, 34216,
45639, 81496, 51318, 59664, 48649, 49563, 52563, 22525, 34077,
49559, 67677, 30877, 34348, 59977, 60208, 63877, 64108, 17836,
53183, 29505, 43327, 27293, 44377, 45090, 48893, 67777, 68977,
69800, 67967, 115984, 35174, 35465, 44893, 60845, 62045, 39345,
43670, 22401, 67411, 26924, 58472, 40117, 41920, 48445, 58085,
61161, 64385, 66058, 37909, 39969, 48994, 54394, 33921, 79759,
25356, 28094, 42794, 48194, 67094, 30509, 39139, 44936, 46462,
72425, 80962, 25488, 53534, 55427, 29876, 40714, 51083, 53335,
47371, 48622, 25640, 30665, 34265), trav_time = c(119, 413, 565,
184, 506, 787, 1177, 210, 2965, 1940, 136, 934, 1543, 622, 1290,
2781, 1859, 54, 214, 89, 463, 943, 1536, 565, 461, 279, 800,
820, 1113, 1344, 214, 205, 991, 314, 29, 1186, 1316, 491, 529,
572, 346, 89, 110, 402, 953, 1211, 394, 49, 54, 481, 2093, 2139,
1406, 1650, 135, 119, 1693, 1187, 49, 255, 49, 602, 1705, 54,
229, 934, 632, 707, 689, 491, 222, 353, 205, 493, 238, 39, 191,
182, 2249, 1083, 669, 917, 1377, 372, 972, 1515, 351, 668, 348,
618, 817, 1021, 971, 874, 685, 425, 407, 178, 251, 296, 230,
32, 93, 129, 325, 631, 707, 1075, 830, 1828, 1167, 1319, 768,
49, 539, 611, 36, 258, 2258, 1939, 2020, 49, 2120, 842, 575,
246, 270, 387, 615, 631, 164, 556, 151, 569, 249, 283, 237, 279,
1073, 1693, 564, 578, 1611, 1458, 1463, 1097, 0, 1076, 881, 737,
0, 1645, 543, 237, 271, 1640, 1494, 1257, 369, 442, 112, 151,
2361, 2370, 757, 682, 290, 541, 409, 839, 11, 1975, 1060, 118,
1441, 1985, 1468, 1495, 376, 426, 421, 699, 755, 559, 1865, 1677,
712, 648, 1045, 633, 105, 2552, 1925, 84, 101, 88, 472, 3229,
794, 706), start_link = c(270549L, 937360L, 212265L, 184658L,
357020L, 976840L, 132606L, 708563L, 568677L, 557064L, 336850L,
141230L, 592921L, 656482L, 815987L, 444204L, 529184L, 293993L,
924069L, 743566L, 988492L, 447485L, 243378L, 442424L, 880219L,
553505L, 307420L, 475317L, 880219L, 137882L, 442424L, 1044971L,
444204L, 715959L, 862183L, 444204L, 86208L, 518340L, 880806L,
390902L, 1057392L, 518340L, 557064L, 444204L, 277196L, 937812L,
444204L, 924041L, 293993L, 924069L, 444204L, 173355L, 207844L,
488357L, 207844L, 921742L, 444204L, 322842L, 924041L, 444204L,
924041L, 208359L, 917289L, 293993L, 924069L, 921742L, 44740L,
592921L, 1031555L, 715194L, 880261L, 444044L, 715194L, 444204L,
589007L, 685965L, 921742L, 715194L, 527966L, 352143L, 814122L,
69948L, 921742L, 261041L, 887737L, 943525L, 219773L, 887737L,
629352L, 887737L, 444204L, 726443L, 444204L, 541592L, 86208L,
89636L, 442424L, 229666L, 598571L, 442424L, 1044971L, 921742L,
731278L, 208365L, 444204L, 773893L, 522604L, 444204L, 911454L,
557064L, 340254L, 179635L, 444204L, 924041L, 1043759L, 325682L,
690654L, 924069L, 444204L, 717241L, 943525L, 924041L, 770275L,
921742L, 383765L, 586665L, 921742L, 444204L, 273230L, 136011L,
921742L, 518320L, 1044971L, 518320L, 390783L, 270549L, 390783L,
270549L, 390783L, 712438L, 444204L, 771873L, 557064L, 656482L,
511889L, 199293L, 511889L, 511889L, 199293L, 656098L, 511889L,
444204L, 313216L, 390783L, 270549L, 550473L, 417690L, 493221L,
921742L, 289147L, 153483L, 1044971L, 557064L, 5297L, 685965L,
86208L, 511889L, 430753L, 592921L, 428902L, 921742L, 444204L,
682408L, 913467L, 693061L, 557064L, 361930L, 444204L, 892054L,
711951L, 181348L, 711951L, 592921L, 338950L, 550473L, 1006099L,
943525L, 577067L, 550473L, 1027040L, 8378L, 444204L, 221998L,
706467L, 724076L, 557064L, 624565L, 444204L, 423728L, 61536L),
end_link = c(937360L, 212265L, 184658L, 357020L, 976840L,
132606L, 708563L, 568677L, 270549L, 336850L, 141230L, 545278L,
655099L, 815987L, 545278L, 529184L, 545278L, 924124L, 545278L,
988492L, 447485L, 243378L, 592922L, 880219L, 553505L, 307420L,
475317L, 880219L, 137882L, 442424L, 921743L, 442424L, 655099L,
862183L, 229128L, 322843L, 557063L, 880806L, 390902L, 1057392L,
518340L, 557063L, 518340L, 277196L, 937812L, 557063L, 924040L,
294688L, 924124L, 545278L, 173355L, 545278L, 488357L, 207844L,
921743L, 207844L, 322843L, 924040L, 294688L, 924040L, 294688L,
917289L, 1043758L, 924124L, 545278L, 44740L, 545278L, 1031555L,
545278L, 880261L, 444044L, 715194L, 921743L, 589007L, 511890L,
921743L, 715194L, 527966L, 352143L, 814122L, 69948L, 715194L,
261041L, 887737L, 558366L, 219773L, 887737L, 629352L, 887737L,
545278L, 726443L, 545278L, 541592L, 545278L, 89636L, 545278L,
229666L, 598571L, 442424L, 557063L, 442424L, 685966L, 208365L,
921743L, 773893L, 522604L, 557063L, 911454L, 545278L, 340254L,
179635L, 545278L, 924040L, 294688L, 325682L, 276534L, 648084L,
545278L, 717241L, 545278L, 924040L, 294688L, 558366L, 383765L,
545278L, 921743L, 586665L, 273230L, 136011L, 545278L, 518320L,
545278L, 518320L, 545278L, 270549L, 390784L, 270549L, 390784L,
712438L, 390784L, 771873L, 545278L, 655099L, 545278L, 199293L,
511890L, 511889L, 199293L, 656098L, 511890L, 511889L, 313216L,
545278L, 270549L, 390784L, 417690L, 493221L, 390784L, 289147L,
921743L, 921743L, 153483L, 5297L, 545278L, 1006143L, 511890L,
430753L, 592922L, 428902L, 1045458L, 685966L, 682407L, 913467L,
693061L, 545278L, 361930L, 545278L, 892054L, 711951L, 181348L,
711951L, 545278L, 338950L, 592922L, 1006099L, 558366L, 577067L,
558366L, 1027040L, 913135L, 550472L, 222013L, 545278L, 724077L,
706467L, 624565L, 545278L, 423728L, 61536L, 423728L), arr_time = c(40075,
42169, 43221, 47340, 50062, 50943, 56733, 56366, 64521, 27413,
47250, 60948, 28182, 73636, 80796, 66975, 67906, 80871, 81115,
27491, 32010, 37590, 45383, 31192, 37388, 43506, 44987, 47647,
66840, 68871, 52200, 56800, 22337, 67473, 72803, 22449, 62174,
32450, 37888, 40331, 41905, 61978, 74792, 21467, 22214, 57872,
22505, 22411, 59463, 59975, 34163, 65968, 27575, 61419, 53294,
57145, 71288, 72491, 72333, 17999, 18044, 52838, 61165, 60553,
60813, 29087, 42267, 34528, 65082, 34420, 35951, 36802, 48534,
51087, 53067, 62161, 62422, 27184, 29371, 55985, 68171, 71119,
27398, 27159, 46239, 58227, 60018, 64535, 74415, 77685, 21491,
42742, 22906, 57126, 45588, 48988, 26203, 27054, 70147, 58133,
72850, 30931, 31090, 31440, 53728, 58866, 64342, 49244, 77307,
53444, 67537, 68589, 27746, 27279, 27872, 59737, 59549, 59866,
27243, 64143, 30511, 29836, 36336, 46481, 82071, 51564, 59934,
49036, 50178, 53194, 22689, 34633, 49710, 68246, 31126, 34631,
60214, 60487, 64950, 65801, 18400, 53761, 31116, 44785, 28756,
45474, 45090, 49969, 68658, 69714, 69800, 69612, 116527,
35411, 35736, 46533, 62339, 63302, 39714, 44112, 22513, 67562,
29285, 60842, 40874, 42602, 48735, 58626, 61570, 65224, 66069,
39884, 41029, 49112, 55835, 35906, 81227, 26851, 28470, 43220,
48615, 67793, 31264, 39698, 46801, 48139, 73137, 81610, 26533,
54167, 55532, 32428, 42639, 51167, 53436, 47459, 49094, 28869,
31459, 34971)), row.names = c(NA, 200L), class = "data.frame")
Большое спасибо заранее!