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)
Bitte geben Sie eine minimale erhalten Beispiel oder müssen wir alle Spalten/Zeilen verstehen? – Christoph
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
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