Как продублировать первую строку для каждой подгруппы фрейма данных, используя R? - PullRequest
2 голосов
/ 27 апреля 2020

У меня есть следующее data.frame (dput() в конце вопроса).

> cars_a_d[1:20,]
   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
16      1000252    64194      2781     444204   529184    66975
17      1000252    66047      1859     529184   545278    67906
18      1000567    80817        54     293993   924124    80871
19      1000567    80901       214     924069   545278    81115
20      1000568    27402        89     743566   988492    27491

Я хочу сгруппировать данные по vehicleRefId и продублировать первую строку каждой группы (это нужно вставить прямо над или под первым рядом группы).

Поэтому желаемый результат будет выглядеть следующим образом:

   vehicleRefId dep_time trav_time start_link end_link arr_time
1            10    39956       119     270549   937360    40075
2            10    39956       119     270549   937360    40075 #duplicate
3            10    41756       413     937360   212265    42169
4            10    42656       565     212265   184658    43221
5            10    47156       184     184658   357020    47340
6            10    49556       506     357020   976840    50062
7            10    50156       787     976840   132606    50943
8            10    55556      1177     132606   708563    56733
9            10    56156       210     708563   568677    56366
10           10    61556      2965     568677   270549    64521
11      1000157    25473      1940     557064   336850    27413
12      1000157    25473      1940     557064   336850    27413 #duplicate
13      1000157    47114       136     336850   141230    47250
14      1000157    60014       934     141230   545278    60948
15      1000183    26639      1543     592921   655099    28182
16      1000183    26639      1543     592921   655099    28182 #duplicate
17      1000183    73014       622     656482   815987    73636
18      1000183    79506      1290     815987   545278    80796
19      1000252    64194      2781     444204   529184    66975 #duplicate
20      1000252    64194      2781     444204   529184    66975
21      1000252    66047      1859     529184   545278    67906
22      1000567    80817        54     293993   924124    80871
23      1000567    80817        54     293993   924124    80871 #duplicate
24      1000567    80901       214     924069   545278    81115

Мой подход пока:

test <-cars_a_d%>% 
  group_by(vehicleRefId) %>%
  as.data.frame(rbind(cars_a_d[1,],cars_a_d))%>%
  ungroup()

данные:

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

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

Ответы [ 3 ]

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

Мы можем использовать slice и дважды выбрать первый ряд.

library(dplyr)
df %>% group_by(vehicleRefId) %>% slice(1L, row_number()) 

#   vehicleRefId dep_time trav_time start_link end_link arr_time
#          <int>    <dbl>     <dbl>      <int>    <int>    <dbl>
# 1           10    39956       119     270549   937360    40075
# 2           10    39956       119     270549   937360    40075
# 3           10    41756       413     937360   212265    42169
# 4           10    42656       565     212265   184658    43221
# 5           10    47156       184     184658   357020    47340
# 6           10    49556       506     357020   976840    50062
# 7           10    50156       787     976840   132606    50943
# 8           10    55556      1177     132606   708563    56733
# 9           10    56156       210     708563   568677    56366
#10           10    61556      2965     568677   270549    64521
# … with 250 more rows
1 голос
/ 27 апреля 2020

Вы можете использовать data.table:

library(data.table)

setDT(df)
df[,lapply(.SD, function(x) c(x[1],x)), by = "vehicleRefId"]

Engli sh глаголы: вы добавляете к каждому подмножеству данных (вашей группе) первую строку.

Выход:

df[,lapply(.SD, function(x) c(x[1],x)), by = "vehicleRefId"][1:15]
    vehicleRefId dep_time trav_time start_link end_link arr_time
 1:           10    39956       119     270549   937360    40075
 2:           10    39956       119     270549   937360    40075
 3:           10    41756       413     937360   212265    42169
 4:           10    42656       565     212265   184658    43221
 5:           10    47156       184     184658   357020    47340
 6:           10    49556       506     357020   976840    50062
 7:           10    50156       787     976840   132606    50943
 8:           10    55556      1177     132606   708563    56733
 9:           10    56156       210     708563   568677    56366
10:           10    61556      2965     568677   270549    64521
11:      1000157    25473      1940     557064   336850    27413
12:      1000157    25473      1940     557064   336850    27413
13:      1000157    47114       136     336850   141230    47250
14:      1000157    60014       934     141230   545278    60948
15:      1000183    26639      1543     592921   655099    28182
1 голос
/ 27 апреля 2020

Одна dplyr возможность может быть:

df %>%
 group_by(vehicleRefId) %>%
 uncount((1:n() == 1) + 1)

   vehicleRefId dep_time trav_time start_link end_link arr_time
          <int>    <int>     <int>      <int>    <int>    <int>
 1           10    39956       119     270549   937360    40075
 2           10    39956       119     270549   937360    40075
 3           10    41756       413     937360   212265    42169
 4           10    42656       565     212265   184658    43221
 5           10    47156       184     184658   357020    47340
 6           10    49556       506     357020   976840    50062
 7           10    50156       787     976840   132606    50943
 8           10    55556      1177     132606   708563    56733
 9           10    56156       210     708563   568677    56366
10           10    61556      2965     568677   270549    64521
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...