Hier einige Beispieldaten:
%Vor% Wie bekomme ich die Summe von A
und C
auch in x1
?
Wenn ich sqldf
verwende:
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!
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:
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.
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
:
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:
Ein ähnlicher Ansatz kann verwendet werden, wenn NA
durch 0
ersetzt werden soll:
Hier ist der data.table
Weg, falls Sie interessiert sind:
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:
, 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. ..
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)
So würden Sie das mit dem Paket reshape
machen:
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. "