.SD
sieht nützlich aus, aber ich weiß nicht wirklich, was ich damit mache. Für was steht das? Warum gibt es eine vorhergehende Periode (Punkt). Was passiert, wenn ich es benutze?
I gelesen:
.SD
ein data.table
die Teilmenge von enthaltende x
s - Daten für jede Gruppe, mit Ausnahme der Spalte Gruppe (n). Es kann beim Gruppieren nach i
, beim Gruppieren nach by
, Keyed by
und _ad hoc_ verwendet werden.by
Bedeutet das, dass die Tochter data.table
s für die nächste Operation gespeichert wird?
r
data.table
Farrel
quelle
quelle
?data.table
wurde dank dieser Frage in Version 1.7.10 verbessert. Es erklärt nun den Namen.SD
gemäß der akzeptierten Antwort.Antworten:
.SD
steht für so etwas wie "S
ubset ofD
ata.table". Die Initiale"."
hat keine Bedeutung , außer dass es noch unwahrscheinlicher ist, dass es zu einem Konflikt mit einem benutzerdefinierten Spaltennamen kommt.Wenn dies Ihre data.table ist:
Auf diese Weise können Sie möglicherweise erkennen, was
.SD
ist:Grundsätzlich unterteilt die
by=y
Anweisung die ursprüngliche Datentabelle in diese beiden Unterabschnittedata.tables
und arbeitet wiederum auf sie.
Während eines der beiden Vorgänge können Sie
data.table
mithilfe des Spitznamens / Handles / Symbols auf das aktuelle Sub zugreifen.SD
. Dies ist sehr praktisch, da Sie auf die Spalten zugreifen und sie bearbeiten können, als ob Sie an der Befehlszeile sitzen und mit einer einzelnen Datentabelle namens.SD
... arbeiten würden, mit der Ausnahme, dass hierdata.table
diese Operationen für jede einzelnedata.table
durch definierte Tabelle ausgeführt werden Kombinationen des Schlüssels, "zusammenfügen" und die Ergebnisse in einem einzigen zurückgebendata.table
!quelle
.SD
istDT[,print(.SD),by=y]
.DT[,print(.SD[,y]),by=y]
, bedeutet dies, dass ich Zugriff auf den Wert von habey
, obwohl dies kein Teil von ist.SD
.y
Woher kommt der Wert des Umfangs? Ist es verfügbar, weil es der aktuelle Wert von istby
?.SD[,y]
ist eine reguläredata.table
Teilmenge, da in der Umgebung, in der es aufgerufen wurde,y
keine Spalte.SD
davon angezeigt wird. In diesem Fall handelt es sich um diej
Umgebung (derDT
Abfrage), in der dieby
Variablen verfügbar sind. Wenn es dort nicht gefunden wird, sieht es im übergeordneten Element und seinem übergeordneten Element usw. auf die übliche R-Weise aus. (Nun, auch über Join geerbten Bereich, der in diesen Beispielen nicht verwendet wird, weil es keinei
s gibt).by=list(x,y,z)
würde bedeutenx
,y
undz
sind zur Verfügungj
. Für den generischen Zugriff sind sie auch eingepackt.BY
. FAQ 2.10 enthält eine gewisse Historie, aber es könnte etwas Klarheit hinzugefügt werden?data.table
. Tolle, Doku-Hilfe wäre sehr willkommen. Noch besser, wenn Sie dem Projekt beitreten und direkt ändern möchten.Bearbeiten:
Angesichts der guten Resonanz dieser Antwort habe ich sie in eine Paketvignette umgewandelt, die jetzt hier verfügbar ist
Angesichts der Häufigkeit, mit der dies geschieht, ist dies meiner Meinung nach eine etwas ausführlichere Darstellung erforderlich, die über die hilfreiche Antwort von Josh O'Brien hinausgeht.
Neben dem S ubset der D ata Akronym in der Regel von Josh zitiert / erstellt, ich denke , es ist auch hilfreich , um die „S“ zu prüfen , für „selbigen“ oder „Selbstreferenz“ stehen -
.SD
ist in seiner einfachsten Gestalt ein reflexiver Verweis auf sichdata.table
selbst - wie wir in den folgenden Beispielen sehen werden, ist dies besonders hilfreich, um "Abfragen" (Extraktionen / Teilmengen / usw. mit[
) zu verketten . Dies bedeutet insbesondere auch, dass.SD
es sich selbst um eine handeltdata.table
(mit der Einschränkung, dass keine Zuordnung zulässig ist:=
).Die einfachere Verwendung von
.SD
ist für die Spaltenuntermenge (dh wenn.SDcols
angegeben); Ich denke, diese Version ist viel einfacher zu verstehen, deshalb werden wir das zuerst unten behandeln. Die Interpretation von.SD
Gruppierungsszenarien (dh wannby =
oderkeyby =
angegeben) in ihrer zweiten Verwendung ist konzeptionell etwas anders (obwohl es im Kern dieselbe ist, da eine nicht gruppierte Operation schließlich ein Randfall der Gruppierung mit just ist Eine Gruppe).Hier sind einige veranschaulichende Beispiele und einige andere Beispiele für Verwendungen, die ich selbst oft implementiere:
Laden von Lahman-Daten
Um dies realistischer zu gestalten, anstatt Daten zu erstellen, laden wir einige Datensätze über Baseball von
Lahman
:Nackt
.SD
Um zu veranschaulichen, was ich über die Reflexivität von meine
.SD
, betrachten Sie die banalste Verwendung:Das heißt, wir sind gerade zurückgekehrt
Pitching
, dh dies war eine übermäßig ausführliche SchreibweisePitching
oderPitching[]
:In Bezug auf die Teilmenge
.SD
ist es immer noch eine Teilmenge der Daten, es ist nur eine triviale (die Menge selbst).Spaltenuntermenge:
.SDcols
Die erste Möglichkeit, Auswirkungen auf das zu haben,
.SD
besteht darin, die in der Verwendung des Arguments enthaltenen Spalten auf Folgendes zu beschränken :.SD
.SDcols
[
Dies ist nur zur Veranschaulichung und war ziemlich langweilig. Aber selbst diese einfache Verwendung eignet sich für eine Vielzahl von äußerst nützlichen / allgegenwärtigen Datenmanipulationsvorgängen:
Spaltentypkonvertierung
Spalte Typumwandlung ist eine Tatsache des Lebens für die Daten munging - als dies geschrieben wurde ,
fwrite
kann nicht automatisch gelesenDate
oderPOSIXct
Spalten und Conversions zurück und her untercharacter
/factor
/numeric
sind üblich. Wir können Gruppen solcher Spalten verwenden.SD
und.SDcols
stapelweise konvertieren.Wir stellen fest, dass die folgenden Spalten wie
character
imTeams
Datensatz gespeichert sind :Wenn Sie durch die Verwendung von
sapply
hier verwirrt sind, beachten Sie, dass es dasselbe ist wie für Basis Rdata.frames
:Der Schlüssel zum Verständnis dieser Syntax zu erinnern ist , dass ein
data.table
(sowiedata.frame
) als ein in Betracht gezogen werden ,list
wobei jedes Element eine Spalte - alsosapply
/lapply
giltFUN
für jede Spalte und gibt das Ergebnis alssapply
/lapply
in der Regel würde (hierFUN == is.character
kehrt einelogical
von Länge 1,sapply
gibt also einen Vektor zurück).Die Syntax zum Konvertieren dieser Spalten
factor
ist sehr ähnlich - fügen Sie einfach den:=
Zuweisungsoperator hinzuBeachten Sie, dass wir
fkt
in Klammern setzen müssen()
, um R zu zwingen, dies als Spaltennamen zu interpretieren, anstatt zu versuchen, den Namenfkt
der RHS zuzuweisen .Die Flexibilität von
.SDcols
(und:=
), einencharacter
Vektor oder eineninteger
Vektor von Spaltenpositionen zu akzeptieren, kann auch für die musterbasierte Konvertierung von Spaltennamen * nützlich sein. Wir könnten allefactor
Spalten konvertieren incharacter
:Und konvertieren Sie dann alle Spalten, die zurück enthalten,
team
infactor
:** Die explizite Verwendung von Spaltennummern (wie
DT[ , (1) := rnorm(.N)]
) ist eine schlechte Praxis und kann im Laufe der Zeit zu unbemerkt beschädigtem Code führen, wenn sich die Spaltenpositionen ändern. Selbst die implizite Verwendung von Zahlen kann gefährlich sein, wenn wir nicht genau kontrollieren, wann wir den nummerierten Index erstellen und wann wir ihn verwenden.Steuerung der RHS eines Modells
Unterschiedliche Modellspezifikationen sind ein Kernmerkmal einer robusten statistischen Analyse. Versuchen wir, die ERA eines Pitchers (Earned Runs Average, ein Maß für die Leistung) anhand der in der
Pitching
Tabelle verfügbaren kleinen Menge von Kovariaten vorherzusagen . Wie variiert die (lineare) Beziehung zwischenW
(gewinnt) undERA
hängt davon ab, welche anderen Kovariaten in der Spezifikation enthalten sind?Hier ist ein kurzes Skript, das die Kraft
.SD
dieser Frage nutzt :Der Koeffizient hat immer das erwartete Vorzeichen (bessere Pitcher haben tendenziell mehr Siege und weniger erlaubte Läufe), aber die Größe kann erheblich variieren, je nachdem, was wir sonst noch kontrollieren.
Bedingte Verknüpfungen
data.table
Die Syntax ist schön für ihre Einfachheit und Robustheit. Die Syntaxx[i]
verarbeitet flexibel zwei gemeinsame Ansätze zu subsetting - wenni
alogical
vector,x[i]
kehrt die Zeilen der demx
entspricht, woi
istTRUE
; Wenni
es sich um ein anderes handeltdata.table
,join
wird a ausgeführt (in der einfachen Form unter Verwendung deskey
s vonx
undi
andernfalls, wennon =
angegeben, unter Verwendung der Übereinstimmungen dieser Spalten).Dies ist im Allgemeinen großartig, wird jedoch nicht ausgeführt, wenn eine bedingte Verknüpfung durchgeführt werden soll , bei der die genaue Art der Beziehung zwischen Tabellen von einigen Merkmalen der Zeilen in einer oder mehreren Spalten abhängt.
Dieses Beispiel ist ein bisschen erfunden, veranschaulicht aber die Idee; siehe hier ( 1 , 2 ) für mehr.
Ziel ist es
team_performance
, derPitching
Tabelle eine Spalte hinzuzufügen, in der die Leistung (Rang) des Teams als bester Pitcher in jedem Team aufgezeichnet wird (gemessen an der niedrigsten ERA unter Pitchern mit mindestens 6 aufgezeichneten Spielen).Beachten Sie, dass die
x[y]
Syntaxnrow(y)
Werte zurückgibt , weshalb sie.SD
rechts in stehtTeams[.SD]
(da die RHS von:=
in diesem Fallnrow(Pitching[rank_in_team == 1])
Werte erfordert .Gruppierte
.SD
OperationenOft möchten wir unsere Daten auf Gruppenebene bearbeiten . Wenn wir angeben
by =
(oderkeyby =
), besteht das mentale Modell für das, was beidata.table
Prozessen passiert ,j
darin, sich vorzustellen, dass Siedata.table
in viele Komponenten unterteilt sinddata.table
, von denen jede einem einzelnen Wert Ihrerby
Variablen entspricht:In diesem Fall
.SD
ist es, mehrere in der Natur - bezieht er sich auf jede dieser sub-data.table
s, one-at-a-time (etwas genauer, der Umfang der.SD
ein einzelner sub-data.table
). Auf diese Weise können wir eine Operation, die wir für jedes Subdata.table
ausführen möchten, präzise ausdrücken, bevor das neu zusammengestellte Ergebnis an uns zurückgegeben wird.Dies ist in einer Vielzahl von Einstellungen nützlich, von denen die häufigsten hier vorgestellt werden:
Gruppenuntermenge
Lassen Sie uns die neuesten Daten für jedes Team in den Lahman-Daten abrufen. Dies kann ganz einfach gemacht werden mit:
Denken Sie daran, dass dies
.SD
selbst eindata.table
ist und.N
sich auf die Gesamtzahl der Zeilen in einer Gruppe bezieht (dies entspricht der Anzahlnrow(.SD)
innerhalb jeder Gruppe), sodass.SD[.N]
die Gesamtheit.SD
für die letzte Zeile zurückgegeben wird, die jeder Zeile zugeordnet istteamID
.Eine andere übliche Version davon ist die Verwendung
.SD[1L]
, um stattdessen die erste Beobachtung für jede Gruppe zu erhalten.Gruppe Optima
Angenommen, wir wollten das beste Jahr für jedes Team zurückgeben, gemessen an der Gesamtzahl der erzielten Läufe (
R
wir könnten dies natürlich leicht anpassen, um auf andere Metriken zu verweisen). Anstatt aus jedem Unterelement ein festes Element zu nehmendata.table
, definieren wir den gewünschten Index jetzt dynamisch wie folgt:Beachten Sie, dass dieser Ansatz natürlich kombiniert werden kann
.SDcols
, um nur Teile vondata.table
jedem zurückzugeben.SD
(mit der Einschränkung,.SDcols
die über die verschiedenen Teilmengen hinweg festgelegt werden sollte).NB :
.SD[1L]
wird derzeit optimiertGForce
( siehe auch ),data.table
Einbauten , die massiv die häufigsten gruppierten Operationen wie beschleunigensum
odermean
- siehe?GForce
für weitere Einzelheiten und halten ein Auge auf / Sprachunterstützung für Anfragen Feature Verbesserung für Updates an dieser Front: 1 , 2 , 3 , 4 , 5 , 6Gruppierte Regression
Zurück zur obigen Anfrage bezüglich der Beziehung zwischen
ERA
undW
, nehmen wir an, dass diese Beziehung von Team zu Team unterschiedlich ist (dh es gibt für jedes Team eine andere Steigung). Wir können diese Regression leicht wiederholen, um die Heterogenität in dieser Beziehung wie folgt zu untersuchen (wobei zu beachten ist, dass die Standardfehler dieses Ansatzes im Allgemeinen falsch sind - die SpezifikationERA ~ W*teamID
wird besser sein - dieser Ansatz ist leichter zu lesen und die Koeffizienten sind in Ordnung). ::Während es ein gutes Maß an Heterogenität gibt, gibt es eine deutliche Konzentration um den beobachteten Gesamtwert
Hoffentlich hat dies die Fähigkeit aufgeklärt,
.SD
schönen, effizienten Code zu ermöglichendata.table
!quelle
Ich habe ein Video darüber gemacht, nachdem ich mit Matt Dowle über .SD gesprochen habe. Sie können es auf YouTube sehen: https://www.youtube.com/watch?v=DwEzQuYfMsI
quelle