2016-06-13 9 views
2

Ich versuche, die spread Funktion von tidyr auf einem Datensatz mit Ziel-und Herkunft Namen für Flugreisen und ihre Anzahl von Passagieren durchzuführen. Ich versuche eine Tabelle zu erstellen, die eventuell für eine Heatmap verwendet werden kann. Daher möchte ich die Origin-Variable in den Zeilen und die Zielvariable als Spalten haben.dplyr tidyr Spread Fehler in Spaltennamen und Eingabe

Ich habe versucht, den Code mit verschiedenen Kombinationen von Argument und auch mit der spread_ ausführen, aber ich habe immer mit Fehlern enden.

Wenn ich die spread_ mit key_col und val_col verwenden, erhalte ich:

Fehler in Spiel (x, Tisch, nomatch = 0L): Objekt 'Destination.Region' nicht gefunden

auf meinem großen Datensatz erzeugt es eine andere Art von Fehler:

Fehler in colnames<- (*tmp*, value = c ("ASIA Subkontinent", "Australia",: Länge von 'dimnames' [2] nicht gleich Array Ausmaß

Es ist das erste Mal, dass ich bin mit tidyr und ich bin Kennenlernen der Pakete, das klingt nicht zu kompliziert. Aber ich arbeite seit einigen Stunden an diesem Problem und konnte in keinem Forum eine Antwort finden.

Danke für die Hilfe,

Hier ein Beispiel für die Art von Daten ist:

data2<-matrix(NA, nrow = 7, ncol=3) 
colnames(data2)<-c("Origin.Destination", "Total.Passengers", "Destination.Region") 
data2[,1] <- c("EAST AFRICA","SOUTHERN AFRICA","WEST AFRICA", "EAST AFRICA", "SOUTHERN AFRICA", "EAST AFRICA","EAST AFRICA") 
data2[,2] <- c(100, 5000, 200, 10000, 200, 20, 4000) 
data2[,3] <- c("WESTERN EUROPE", "SOUTH AMERICA", "ASIA", "SOUTH AMERICA", "ASIA", "WESTERN EUROPE", "WESTERN EUROPE") 

Daten2 < -data.frame (Daten2)

Und hier ist mein Code:

DF<- 
    data2 %>% 
    spread_(key_ = "Destination.Region", 
    value_ = "Total.Passengers", 
    convert = TRUE, 
    drop = FALSE) 
+0

'Total.Passengers' gegenüber' Passengers'? – joran

+0

Das ist ein Tippfehler in meiner Frage. Ich habe es gerade korrigiert. Immer noch ein Problem mit meinem Code. Danke fürs bemerken. –

+0

Ihre Beispieldaten scheinen auch so zu sein, dass Sie die Spalten auf andere Weise falsch gekennzeichnet haben. Warum reparierst du dein Beispiel nicht zuerst vollständig? – joran

Antwort

0

Hier sind ein paar Dinge zu versuchen:

1) Ich würde data2 in eine data.frame konvertieren. Es erleichtert das Arbeiten damit erheblich.

data2<-matrix(NA, nrow = 7, ncol=3) 
colnames(data2)<-c("Origin.Destination", "Total.Passengers", "Destination.Region") 
data2[,1] <- c("EAST AFRICA","SOUTHERN AFRICA","WEST AFRICA", "EAST AFRICA", "SOUTHERN AFRICA", "EAST AFRICA","EAST AFRICA") 
data2[,2] <- c(100, 5000, 200, 10000, 200, 20, 4000) 
data2[,3] <- c("WESTERN EUROPE", "SOUTH AMERICA", "ASIA", "SOUTH AMERICA", "ASIA", "WESTERN EUROPE", "WESTERN EUROPE") 

data3<-data.frame(data2) 

2) Die neue data.frame wird eine eindeutige Spalte (in der Regel eine Indexspalte) müssen die spread_ Funktion Arbeit richtig zu machen. Ansonsten:

DF<- 
    data3 %>% 
    spread_(key_ = "Destination.Region", 
      value_ = "Total.Passengers", 
      convert = TRUE, 
      drop = FALSE) 

Error: Duplicate identifiers for rows (1, 6, 7) 

Aber wenn:

data3$index<-1:nrow(data3) 

DF<- 
    data3 %>% 
    spread_(key_ = "Destination.Region", 
      value_ = "Total.Passengers", 
      convert = TRUE, 
      drop = FALSE) 
DF 

Origin.Destination index ASIA SOUTH AMERICA WESTERN EUROPE 
1   EAST AFRICA  1 NA   NA   100 
2   EAST AFRICA  2 NA   NA    NA 
3   EAST AFRICA  3 NA   NA    NA 
4   EAST AFRICA  4 NA   10000    NA 
5   EAST AFRICA  5 NA   NA    NA 
6   EAST AFRICA  6 NA   NA    20 
7   EAST AFRICA  7 NA   NA   4000 
8  SOUTHERN AFRICA  1 NA   NA    NA 
9  SOUTHERN AFRICA  2 NA   5000    NA 
10 SOUTHERN AFRICA  3 NA   NA    NA 
11 SOUTHERN AFRICA  4 NA   NA    NA 
12 SOUTHERN AFRICA  5 200   NA    NA 
13 SOUTHERN AFRICA  6 NA   NA    NA 
14 SOUTHERN AFRICA  7 NA   NA    NA 
15  WEST AFRICA  1 NA   NA    NA 
16  WEST AFRICA  2 NA   NA    NA 
17  WEST AFRICA  3 200   NA    NA 
18  WEST AFRICA  4 NA   NA    NA 
19  WEST AFRICA  5 NA   NA    NA 
20  WEST AFRICA  6 NA   NA    NA 
21  WEST AFRICA  7 NA   NA    NA 

Eine Sache, die hier sinnvoll machen könnte, wäre zu sum die Gesamt Passagiere nach Herkunft und Ziel. Das würde die Verwendung von Indizes vermeiden und so viele NAs verhindern:

Origin <- c("EAST AFRICA","SOUTHERN AFRICA","WEST AFRICA", "EAST AFRICA", "SOUTHERN AFRICA", "EAST AFRICA","EAST AFRICA") 
Passengers <- c(100, 5000, 200, 10000, 200, 20, 4000) 
Destination <- c("WESTERN EUROPE", "SOUTH AMERICA", "ASIA", "SOUTH AMERICA", "ASIA", "WESTERN EUROPE", "WESTERN EUROPE") 
data3<-data.frame(Origin, Passengers, Destination) 

DF<-data3 %>% group_by(Origin, Destination) %>% 
    summarise(Total.Passengers = sum(Passengers)) %>% 
    spread(Destination, Total.Passengers) 

DF 

      Origin ASIA SOUTH AMERICA WESTERN EUROPE 
      (fctr) (dbl)   (dbl)   (dbl) 
1  EAST AFRICA NA   10000   4120 
2 SOUTHERN AFRICA 200   5000    NA 
3  WEST AFRICA 200   NA    NA 
+0

Hallo @Bryan, tatsächlich arbeite ich an einem Datenrahmen. Ich bin mir jedoch nicht sicher, warum wir eine Indexspalte benötigen. Ich habe versucht, und Ihren Code auf meine Daten und ich habe diesen Fehler: –

+0

Fehler in utils :: getS3method ("as_data_frame", "Matrix", envir = asNamespace ("tibble")): unbenutztes Argument (envir = asNamespace ("tibble")) –

+0

Der Index wird benötigt, weil (in Bezug auf die Beispieldaten 'data3') die Spalten 1, 6 und 7 Ostafrika als Ursprungsregion und Westeuropa als Destination.Region haben. Es gibt nichts, um diese Zeilen außer Total.Passagers zu unterscheiden. Da diese Spalte zum Verbreiten verwendet wird, wird sie mehrdeutig. Zum Beispiel, für Ostafrika nach Westeuropa, welchen Wert sollte es verwenden? 100, 20 oder 4000? –

Verwandte Themen