2017-04-19 13 views
0

Ich habe mir den Kopf gebrochen, um zu verstehen, wie man das macht, aber bis jetzt konnte ich keine einfache Lösung finden. Ich habe folgende Daten-Set:Gruppieren, zusammenfassen und kombinieren Variablen

Itin Origin Destination Passengers 
1  A  B   1 
1  B  C   1 
2  A  B   3 
3  E  B   10 
4  A  C   2 
5  E  B   4 

Was ich versuche auf das Itin Variable zu tun basiert, eine Pfadvariable zu schaffen, während die Passagiere variabel zu halten. Der einfachste Weg, dies zu verstehen, besteht darin, einen normalen Flug mit einer Skala zu sehen. Zum Beispiel in Itin = 1 ein Passagier geht von A nach B nach C. Das einzige, was zu halten ist, ist die Herkunft A Destination B, Ziel C und Passagiere wie es ist, die gleich 1 ist. Genau wie im folgenden Beispiel.

Path Passengers 
A-B-C 1 
A-B  3 
E-B  10 
A-C  2 
E-B  4 

Ich habe mit group_by mit dplyr mehrere Möglichkeiten ausprobiert, wie es oft schneller als die Basisoptionen, aber ich konnte nicht wirklich das Ergebnis als im zweiten Beispiel mit einem neuen Variablen Pfad erhalten. Ich dachte mir auch, ich benutze tidyr, aber ich bin mir nicht sicher, wie es hier helfen könnte. Irgendeine Idee, wie man das macht?

Edit: Was die Variable Pfad, es ist nicht wirklich wichtig, wenn als A-B-C endet, oder A,B,C oder A B C wie ich nur die Syntax aussehen wird.

+0

Können Sie davon ausgehen, dass der Datensatz sortiert ist? d.h. der erste Abschnitt des Fluges ist die erste Reihe für diese bestimmte Route. – thc

+0

@thc ja es ist ja so sortiert wie ich es schon vorher gemacht habe. – FilipeTeixeira

Antwort

2

EDIT Eine schnellere Lösung data.table

df1<-read.table(text="Itin Origin Destination Passengers 
1  A  B   1 
1  B  C   1 
2  A  B   3 
3  E  B   10 
4  A  C   2 
5  E  B   4",header=TRUE, stringsAsFactors=FALSE) 

library(data.table) 
DT <-data.table(df1) 
DT[,.(Passengers, Path = paste(Origin[1],paste(Destination, collapse = " "), 
           collapse = " ")), by=Itin] 

    Itin Passengers Path 
1: 1   1 A B C 
2: 1   1 A B C 
3: 2   3 A B 
4: 3   10 E B 
5: 4   2 A C 
6: 5   4 E B 

Hier ist meine orignal Lösung mit dplyr mit:

df1<-read.table(text="Itin Origin Destination Passengers 
1  A  B   1 
1  B  C   1 
2  A  B   3 
3  E  B   10 
4  A  C   2 
5  E  B   4",header=TRUE, stringsAsFactors=FALSE) 

library(dplyr) 
df1 %>% 
group_by(Itin) %>% 
summarise(Passengers=max(Passengers), 
      Path = paste(Origin[1],paste(Destination, collapse = " "), 
           collapse = " ")) 

# A tibble: 5 × 3 
    Itin Passengers Path 
    <int>  <int> <chr> 
1  1   1 A B C 
2  2   3 A B 
3  3   10 E B 
4  4   2 A C 
5  5   4 E B 
+0

Danke. Es funktioniert tatsächlich. Ich frage mich, ob es möglich ist, es zu beschleunigen, denn für 9.000.000 Beobachtungen dauert es ungefähr 4 Minuten. Ich habe es mit unite() von tidyr versucht, aber ich denke nicht, dass es eine Lösung ist. Ich bin mir auch nicht sicher, ob die Zeit aufgrund der Paste() oder etwas anderes ist. – FilipeTeixeira

+1

@FilipeTeixeira Ich fügte eine 'data.table' Lösung hinzu, die viel schneller sein sollte. Wenn die "dplyr" -Lösung 4 Minuten in Ihrem realen Datenset benötigt, dürfte die "data.table" -Lösung ungefähr 30 Sekunden dauern. Sag mir, wie lange es dauert, ich bin neugierig. –

+0

Funktioniert perfekt. Das Ausführen der 'data.table' -Option dauert ~ 120 Sekunden statt 240, was beträchtlich ist, da am Ende diese 9.000.000 Beobachtungen nur Q1 für ein Jahr sind und ich habe 10 Jahre zu sehen. Vielen Dank. Du hast mir eine Menge Zeit mit einer wirklich einfachen Lösung gerettet :). – FilipeTeixeira

0

Lesen von Daten:

read.table(textConnection("Itin Origin Destination Passengers 
1  A  B   1 
1  B  C   1 
2  A  B   3 
3  E  B   10 
4  A  C   2 
5  E  B   4"), header=T, stringsAsFactors=F) -> df 

Mit Base R in diesem Fall:

Path <- lapply(unique(df$Itin), function(it) { 
    x <- subset(df, Itin==it) 
    c(x$Origin[1], x$Destination) 
}) 
new_df <- unique(df[,c("Itin", "Passengers")]) 
new_df$Path <- Path 

> new_df 
    Itin Passengers Path 
1 1   1 A, B, C 
3 2   3 A, B 
4 3   10 E, B 
5 4   2 A, C 
6 5   4 E, B 
+0

Danke. Leider ist diese Option mit 9.000.000 Beobachtungen zu langsam. Ich lief den Code und nach 15 Minuten war es noch nicht vorbei. Deshalb war ich eher für eine Option von Dplyr, die tendenziell schneller ist. – FilipeTeixeira

Verwandte Themen