Как по-разному относиться к первому и последнему ряду подмножества, используя R? - PullRequest
2 голосов
/ 26 апреля 2020

У меня есть 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")

Большое спасибо заранее!

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Опция, использующая data.table:

output <- setDT(DF)[, .(
        link = shift(end_link, fill=start_link[1L]),
        arr_time = shift(arr_time, fill=0L),
        duration = c(dep_time[1L], 
            #dep_time of next row - current row arr_time
            (shift(dep_time, -1L) - arr_time)[-c(1L, .N)], 
            max(arr_time) - arr_time[.N])
    ), vehicleRefId]

output[vehicleRefId==10L]:

   vehicleRefId   link arr_time duration
1:           10 270549        0    39956
2:           10 937360    40075      487
3:           10 212265    42169     3935
4:           10 184658    43221     2216
5:           10 357020    47340       94
6:           10 976840    50062     4613
7:           10 132606    50943     -577
8:           10 708563    56733     5190
9:           10 568677    56366        0

DF[vehicleRefId==10]:

   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
1 голос
/ 26 апреля 2020

Мы можем сгруппировать по «vehicleRefId» и получить разницу между lag из «arr_time» и «dep_time» для создания новых столбцов

library(dplyr)
df1 %>% 
  group_by(vehicleRefId) %>%
  transmute(link = start_link, new_arr_time = lag(arr_time, default = 0), 
           duration = replace(dep_time - lag(arr_time), 1, first(arr_time)) ) %>%
  ungroup 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...