Wie bekomme ich die Summe in der Aggregatfunktion?

8

Hier einige Beispieldaten:

%Vor%

Wie bekomme ich die Summe von A und C auch in x1 ?

%Vor%

Wenn ich sqldf verwende:

%Vor%

Warum bekomme ich <NA> in der ersten Zeile, aber NA in der dritten Zeile? Was sind die Unterschiede zwischen ihnen? Warum bekomme ich <NA> ? Es gibt keine <NA> in Daten!

%Vor%

Das sqldf Problem bleibt hier, warum sum(x4) bekommt NA , im Gegenteil sum(x5) bekommt <NA> ?

Ich kann beweisen, dass alle NA sowohl in x4 als auch in x5 auf diese Weise identisch sind:

%Vor%

Also ist die Tatsache, dass sqldf sum(x4) und sum(x5) anders behandelt, so seltsam, dass ich denke, dass es in sqldf ein logisches Durcheinander gibt. Es kann in anderen PC reproduziert werden. Bitte zuerst und dann die Diskussion weitergehen.

    
it_is_a_literature 30.12.2013, 11:27
quelle

4 Antworten

5

Da die Formelmethode für aggregate standardmäßig NA -Werte verarbeitet, müssen Sie diese überschreiben, bevor Sie das na.rm -Argument von sum verwenden. Sie können dies tun, indem Sie na.action auf NULL oder na.pass :

setzen %Vor%

In Bezug auf sqldf scheint es, als ob die Spalten in unterschiedliche Typen umgewandelt werden, je nachdem, ob das Element in der ersten Zeile der ersten Gruppierungsvariablen NA ist oder nicht. Wenn es sich um NA handelt, wird diese Spalte als character umgewandelt.

Vergleiche:

%Vor%

Es gibt jedoch eine einfache Problemumgehung: Weisen Sie den neu erstellten Spalten den ursprünglichen Namen zu. Vielleicht kann SQLite einige der Informationen aus der vorherigen Datenbank übernehmen? (Ich benutze SQL nicht wirklich.)

Beispiel (mit demselben "df2", das früher erstellt wurde):

%Vor%

Sie können einfach paste verwenden, um Ihre select -Anweisung zu erstellen:

%Vor%

Ein ähnlicher Ansatz kann verwendet werden, wenn NA durch 0 ersetzt werden soll:

%Vor%     
A5C1D2H2I1M1N2O1R2T1 01.01.2014, 13:59
quelle
6

Hier ist der data.table Weg, falls Sie interessiert sind:

%Vor%

Wenn Sie möchten, dass sum NA anstelle der Summe nach dem Entfernen von NAs zurückgibt, entfernen Sie einfach das Argument na.rm=TRUE .

.SD hier ist eine interne Variable data.table , die standardmäßig alle Spalten erstellt, die nicht in by sind - hier alle außer x1 . Sie können den Inhalt von .SD überprüfen, indem Sie Folgendes tun:

%Vor%

, um eine Vorstellung davon zu bekommen, was .SD ist. Wenn Sie interessiert sind, überprüfen Sie ?data.table für andere interne (und sehr nützliche) Sondervariablen wie .I , .N , .GRP usw. ..

    
Arun 30.12.2013 12:38
quelle
2

aggregate(data[, -1], by=list(data$x1), FUN=sum)

Ich habe die erste Spalte gelöscht, weil Sie sie nicht in der Summe verwenden, sondern nur eine Gruppenvariable, um die Daten zu teilen (tatsächlich habe ich sie dann in "by" verwendet)

    
Davide Passaretti 30.12.2013 12:01
quelle
2

So würden Sie das mit dem Paket reshape machen:

%Vor%

Alternativ könnten Sie na.rm während des Prozesses melt() -ing selbst ausgeführt haben.

Das Tolle daran, library(reshape) zu lernen, ist der Autor ( "Umgestaltung der Daten mit der umformen Paket "),

  

"In R gibt es eine Reihe von allgemeinen Funktionen, die Daten aggregieren können,   zum Beispiel tapply, by und aggregate, und eine Funktion speziell für   Daten neu gestalten, umformen. Jede dieser Funktionen neigt dazu, sich gut zu verhalten   mit einem oder zwei spezifischen Szenarien, und jedes benötigt etwas anders   Eingabeargumente In der Praxis brauchen Sie sorgfältige Überlegungen zum Stück   zusammen die richtige Abfolge von Operationen, um Ihre Daten in die   Form, die du willst. Das Umgestaltungspaket ist aus meinen Frustrationen gewachsen   mit Umformungsdaten für die Kundenberatung und überwindet diese   Probleme mit einem allgemeinen konzeptionellen Rahmen, der nur zwei verwendet   Funktionen: schmelzen und gießen. "

    
vijucat 01.01.2014 16:14
quelle

Tags und Links