2016-07-15 6 views
1

ich diese Probebearbeiten/Merge Zeilen, wenn in Folge Faktor mit R

data <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L), .Label = c("a", "b"), class = "factor"), minTime = structure(c(1L, 
2L, 3L, 4L, 5L, 7L, 6L, 8L, 9L, 10L), .Label = c("2014-06-06 07:39:50", 
"2014-06-07 02:24:32", "2014-06-07 15:14:29", "2014-06-07 2:29", 
"2014-06-08 5:40", "2014-06-18 17:54:42", "2014-06-18 2:45", 
"2014-06-19 02:37:53", "2014-06-19 19:15", "2014-06-19 22:15" 
), class = "factor"), maxTime = structure(c(1L, 3L, 4L, 2L, 5L, 
6L, 7L, 8L, 9L, 10L), .Label = c("2014-06-07 01:41:31", "2014-06-07 10:01", 
"2014-06-07 14:44:08", "2014-06-07 22:31:02", "2014-06-08 5:50", 
"2014-06-18 2:50", "2014-06-19 01:49:05", "2014-06-19 18:51:36", 
"2014-06-19 20:15", "2014-06-19 23:15"), class = "factor"), duration.minutes = c(NA, 
740L, 437L, 452L, NA, NA, 474L, 974L, 4062L, 353L), event = structure(c(1L, 
4L, 4L, 2L, 2L, 1L, 4L, 4L, 3L, 4L), .Label = c("enter", "exit", 
"stop", "trip"), class = "factor")), .Names = c("id", "minTime", 
"maxTime", "duration.minutes", "event"), class = "data.frame", row.names = c(NA, 
-10L)) 

haben würde Ich mag die Ereignisse „Reisen“ verschmelzen, wenn sie für jeden id aufeinander folgend sind.

Wo die consecutives für die id a und b stellt wurden zusammengelegt:

  • MaxTime bearbeitet wurde die volle Länge der Reise
  • duration.minutes bearbeitet wurde auch zu haben.

Zum Beispiel dieser Ausgabe:

dput(output.wanted) 
structure(list(id = structure(c(1L, 1L, 1L, 2L, 2L, 1L, 2L), .Label = c("a", 
"b"), class = "factor"), minTime = structure(c(5L, 6L, 7L, 2L, 
1L, 3L, 4L), .Label = c("18.6.2014 17:54", "18.6.2014 2:45", 
"19.6.2014 19:15", "19.6.2014 22:15", "6.6.2014 7:39", "7.6.2014 2:24", 
"7.6.2014 2:29"), class = "factor"), maxTime = structure(c(5L, 
7L, 6L, 1L, 2L, 3L, 4L), .Label = c("18.6.2014 2:50", "19.6.2014 18:51", 
"19.6.2014 20:15", "19.6.2014 23:15", "7.6.2014 1:41", "7.6.2014 10:01", 
"7.6.2014 22:31"), class = "factor"), duration.minutes = c(NA, 
1177L, 452L, NA, 1448L, 4062L, 353L), event = structure(c(1L, 
4L, 2L, 1L, 4L, 3L, 4L), .Label = c("enter", "exit", "stop", 
"trip"), class = "factor")), .Names = c("id", "minTime", "maxTime", 
"duration.minutes", "event"), class = "data.frame", row.names = c(NA, 
-7L)) 

Der Punkt ist, dass ich bin auf der Suche alle Ereignis (Reise oder Stopp) zu verschmelzen, wenn sie für die gleiche ID aufeinander folgend sind. aber wenn der Anschlag oder die Reise einzigartig ist, es bleibt die gleiche

Ich habe versucht, es mit group_by und mutieren zu tun, aber ich bin ein wenig verloren ...

- ich die Lösung gefunden, aber gibt es noch ein kleines Problem mit den Ereignissen stops

Hier wird eine Probe:

> dput(total) 
structure(list(Ship = c(205482000, 205482000, 205482000, 205482000, 
205482000, 205482000, 205482000, 205482000, 205482000, 205482000, 
205482000, 205482000), minTime = structure(c(1401570241, 1401969219, 
1401981860, 1402052108, 1402768362, 1402772602, 1402841443, 1402855773, 
1403056361, 1403278916, 1403290856, 1403367735), class = c("POSIXct", 
"POSIXt")), maxTime = structure(c(1401966639, 1401980399, 1402051849, 
1402056430, 1402772313, 1402839873, 1402852433, 1403052550, 1403276355, 
1403289496, 1403367596, 1403371285), class = c("POSIXct", "POSIXt" 
)), duration.minutes = structure(c(6607, 186, 1166, NA, NA, 1121, 
183, 3280, 3667, 176, 1279, NA), class = "difftime", units = "mins"), 
    event = c("stop", "trip", "trip", "exit", "enter", "trip", 
    "trip", "stop", "stop", "trip", "trip", "exit"), dist.sailed = c(NA, 
    50254.2034817555, 349194.108518887, NA, NA, 347816.081064252, 
    50035.8859874946, NA, NA, 49982.687612038, 351978.737678528, 
    NA)), .Names = c("Ship", "minTime", "maxTime", "duration.minutes", 
"event", "dist.sailed"), class = "data.frame", row.names = c(4L, 
5L, 6L, 2L, 1L, 7L, 8L, 9L, 10L, 11L, 12L, 3L)) 

der folgende Code ist die komplette Dauer des Anschlages nicht produziert, sondern nur NA:

total <- total %>% 
    group_by(Ship) %>% 
    mutate(new_id = data.table::rleid(event)) %>% 
    group_by(event, new_id, Ship) %>% 
    mutate(duration.minutes = ifelse(event == 'trip', sum(duration.minutes), duration.minutes), maxTime = tail(maxTime, 1))%>% 
    mutate(duration.minutes = ifelse(event == 'stop', sum(duration.minutes), duration.minutes), maxTime = tail(maxTime, 1))%>% 
    mutate(dist.sailed = ifelse(event == 'trip', sum(dist.sailed), dist.sailed), dist.sailed = tail(dist.sailed, 1)) %>% 
    filter(!duplicated(duration.minutes)) %>% 
    select(-new_id) 

Ich habe mutate(duration.minutes = ifelse(event == 'stop', sum(duration.minutes), duration.minutes), maxTime = tail(maxTime, 1))%>%, um den Code von @Sotos)

+0

Bitte geben Sie eine minimale erhalten Beispiel oder müssen wir alle Spalten/Zeilen verstehen? – Christoph

+0

Es ist einfacher, alle Spalten/Zeilen zu verstehen: Es gibt Ereignisse (Trip, Stop, Enter oder Exit). minTime ist der Anfang der Entlüftung und maxTime das Ende. – Floni

+0

ist diese Frage nicht ähnlich zu dieser? http://StackOverflow.com/Questions/38054518/how-to-merge-rows-with-consecutive-datetime/38055667#38055667 außer Sie müssten nach ID und Ereignis gruppieren? – theArun

Antwort

2

Dies wird ein wenig chaotisch,

library(dplyr) 
data %>% 
    group_by(id) %>% 
    mutate(new_id = data.table::rleid(event)) %>% 
    group_by(event, new_id, id) %>% 
    mutate(duration.minutes = ifelse(event == 'trip', sum(duration.minutes), duration.minutes), maxTime = tail(maxTime, 1)) %>% 
    filter(!duplicated(duration.minutes)) %>% 
    select(-new_id) 

#new_id  id    minTime    maxTime duration.minutes event 
# <int> <fctr>    <fctr>    <fctr>   <int> <fctr> 
#1  1  a 2014-06-06 07:39:50 2014-06-07 01:41:31    NA enter 
#2  2  a 2014-06-07 02:24:32 2014-06-07 22:31:02    1177 trip 
#3  3  a  2014-06-07 2:29  2014-06-08 5:50    452 exit 
#4  3  a  2014-06-08 5:40  2014-06-08 5:50    NA exit 
#5  1  b  2014-06-18 2:45  2014-06-18 2:50    NA enter 
#6  2  b 2014-06-18 17:54:42 2014-06-19 18:51:36    1448 trip 
#7  3  b 2014-06-19 19:15 2014-06-19 20:15    4062 stop 
#8  4  b 2014-06-19 22:15 2014-06-19 23:15    353 trip 

Wenn wir den gleichen Code für stop statt trip führen wir die folgenden Ergebnisse

#new_id  Ship    minTime    maxTime duration.minutes event dist.sailed 
# <int>  <dbl>    <time>    <time>   <dbl> <chr>  <dbl> 
#1  1 205482000 2014-06-01 00:04:01 2014-06-05 14:10:39    6607 stop   NA 
#2  2 205482000 2014-06-05 14:53:39 2014-06-06 13:50:49    186 trip 50254.20 
#3  2 205482000 2014-06-05 18:24:20 2014-06-06 13:50:49    1166 trip 349194.11 
#4  3 205482000 2014-06-06 13:55:08 2014-06-06 15:07:10    NA exit   NA 
#5  4 205482000 2014-06-14 20:52:42 2014-06-14 21:58:33    NA enter   NA 
#6  5 205482000 2014-06-14 22:03:22 2014-06-15 20:13:53    1121 trip 347816.08 
#7  5 205482000 2014-06-15 17:10:43 2014-06-15 20:13:53    183 trip 50035.89 
#8  6 205482000 2014-06-15 21:09:33 2014-06-20 17:59:15    6947 stop   NA 
#9  7 205482000 2014-06-20 18:41:56 2014-06-21 19:19:56    176 trip 49982.69 
#10  7 205482000 2014-06-20 22:00:56 2014-06-21 19:19:56    1279 trip 351978.74 
#11  8 205482000 2014-06-21 19:22:15 2014-06-21 20:21:25    NA exit   NA 
+0

vielen Dank. Ich probierte ein größeres Beispiel aus (hier: https://www.dropbox.com/sh/bcl5k8t6x5n1rgg/AAB80VppmvV0EttmTRX9-tbya?dl=0) und es funktioniert nicht so viel ... es ändert sich viel Daten! – Floni

+0

@Floni was meinst du das Ändern der Daten? (Kann nicht auf Ihren gesamten Datensatz zugreifen - Arbeitseinschränkungen) – Sotos

+0

Es tut eine Menge Dinge (Gruppe von, mutieren), aber ich kann nicht verstehen, was es tut! Es sieht sehr merkwürdig aus. – Floni

0

, wenn Sie die Verwendung dplyr Paket, Sie haben summarise zu verwenden, nicht mutate Daten in irgendeiner Art und Weise zu kombinieren. Wie

some.df %>% 
group_by(event) %>% 
summarise(sum.maxTime = sum(maxTime), sum.duration = sum(duration.minutes)) 

Mutate hinzufügt oder eine Spalte in Ihrer data.frame ändern, aber das Ergebnis wird die gleiche Anzahl von Zeilen wie das Original immer hat. Die Zeilennummer nach summarise entspricht der Anzahl der Gruppen in Ihrem Dataset.

this helps

+0

Ja, ich war fast da. Aber ich muss das nur bearbeiten, wenn die Ereignisse "trip" oder "stop" für eine ID aufeinander folgen, nicht die ganze Zeit. – Floni

Verwandte Themen