2015-10-10 10 views
6

Mein df sieht wie folgt aus:dcast von lang auf Großformat Umstrukturierung nicht funktioniert

Id Task Type Freq 
3  1 A  2 
3  1 B  3 
3  2 A  3 
3  2 B  0 
4  1 A  3 
4  1 B  3 
4  2 A  1 
4  2 B  3 

ich von Id restrukturieren wollen und erhalten:

Id A B … Z  
3 5 3  
4 4 6   

Ich habe versucht:

df_wide <- dcast(df, Id + Task ~ Type, value.var="Freq") 

und hat den Fehler:

Aggregation function missing: defaulting to length 

Ich kann nicht herausfinden, was in die fun.aggregate zu setzen. Was ist das Problem?

+0

Basierend auf dem gezeigten Beispiel, bekomme ich keine Warnungen. Wenn Sie Duplikate haben, müssen Sie möglicherweise eine Sequenzspalte erstellen – akrun

+0

Wenn Sie die 'Summe' benötigen (basierend auf der erwarteten Ausgabe)' dcast (df, Id ~ Typ, Wert.var = 'Freq', Summe) ' – akrun

+0

Danke Jaap! Ich bin mir nicht sicher, ob ich Ihre Erklärung vollständig verstanden habe: Meine ersten beiden Spalten (ID und Aufgabe) müssen von zwei Zeilen auf eine reduziert werden. Ist das der Grund, warum ich die Funktion fun.aggregate brauche? Und wenn ja - warum "summieren"? Ich fasse sie nicht zusammen. – user3315563

Antwort

7

Der Grund, warum Sie diese Warnung erhalten in der Beschreibung von fun.aggregate ist (siehe ?dcast):

aggregation function needed if variables do not identify a single observation for each output cell. Defaults to length (with a message) if needed but not specified

So wird eine Aggregationsfunktion benötigt, wenn es mehr als einen Wert für einen Platz in der Breite von Datenrahmen.

Eine Erklärung auf der Grundlage Ihrer Daten:

Wenn Sie dcast(df, Id + Task ~ Type, value.var="Freq") erhalten Sie:

Id Task A B 
1 3 1 2 3 
2 3 2 3 0 
3 4 1 3 3 
4 4 2 1 3 

Welche weil für jede Kombination von Id, Task und Type nur Wert logisch ist in Freq. Aber wenn man dcast(df, Id ~ Type, value.var="Freq") verwenden Sie diese erhalten (einschließlich einer Warnmeldung):

Aggregation function missing: defaulting to length 
    Id A B 
1 3 2 2 
2 4 2 2 

nun am oberen Teil Ihrer Daten im Rückblick:

Id Task Type Freq 
3  1 A  2 
3  1 B  3 
3  2 A  3 
3  2 B  0 

Sie sehen, warum dies der Fall ist. Für jede Kombination von Id und Type gibt es zwei Werte in Freq (für Id 3: 2 und 3 für A & 3 und 0 für Typen B), während Sie nur einen Wert an dieser Stelle in dem breiten Datenrahmen für jeden Wert von type setzen können . Daher möchte dcast diese Werte in einem Wert aggregieren. Die Standardaggregationsfunktion ist length, aber Sie können andere Aggregationsfunktionen wie sum, mean, sd oder eine benutzerdefinierte Funktion verwenden, indem Sie sie mit fun.aggregate angeben.

Zum Beispiel mit fun.aggregate = sum Sie erhalten:

Id A B 
1 3 5 3 
2 4 4 6 

Nun gibt keine Warnung, weil dcast erzählt wird, was zu tun ist, wenn es mehr als ein Wert ist: Rückgabe der Summe der Werte.