.SD
wygląda na przydatne, ale tak naprawdę nie wiem, co z nim robię. Co to oznacza? Dlaczego występuje poprzednia kropka (kropka). Co się dzieje, gdy go używam?
Czytałem:
.SD
to zbiór data.table
zawierający podzbiór x
danych dla każdej grupy, z wyłączeniem kolumn grup. Może być używany podczas grupowania według i
, podczas grupowania według by
, klucza by
i _ad hoc_by
Czy to oznacza, że córka data.table
zostaje zachowana w pamięci do następnej operacji?
r
data.table
Farrel
źródło
źródło
?data.table
został ulepszony w wersji 1.7.10, dzięki temu pytaniu. Teraz wyjaśnia nazwę.SD
zgodnie z zaakceptowaną odpowiedzią.Odpowiedzi:
.SD
oznacza coś w rodzaju „S
ubset ofD
ata.table”. Początek nie ma żadnego znaczenia"."
, poza tym, że jest jeszcze mniej prawdopodobne, że dojdzie do konfliktu z nazwą kolumny zdefiniowaną przez użytkownika.Jeśli to są Twoje dane. Tabela:
Może to pomóc Ci zobaczyć, co
.SD
to jest:Zasadniczo
by=y
instrukcja dzieli pierwotną tabelę data.table na te dwie pod-data.tables
i działa na nich po kolei.
Podczas gdy działa na którymkolwiek z nich, pozwala ci odwołać się do aktualnego podrzędnego
data.table
przy użyciu pseudonimu / uchwytu / symbolu.SD
. Jest to bardzo przydatne, ponieważ możesz uzyskać dostęp i operować na kolumnach tak, jakbyś siedział w wierszu poleceń, pracując z pojedynczą tabelą danych o nazwie.SD
... z wyjątkiem tego, że tutaj wykonaszdata.table
te operacje na każdymdata.table
zdefiniowanym przez kombinacje klucza, „wklejanie” ich z powrotem i zwracanie wyników w jednymdata.table
!źródło
.SD
toDT[,print(.SD),by=y]
.DT[,print(.SD[,y]),by=y]
oznacza, że mam dostęp do wartościy
, mimo że nie jest ona częścią.SD
. Skąd bierze się wartośćy
posiadania zakresu? Czy jest dostępny b / c to jest aktualna wartośćby
?.SD[,y]
Jest zwykłymdata.table
podzbiorem tak, ponieważy
nie jest to kolumna.SD
wygląda w środowisku, który wywołał to, co w tym przypadku, toj
środowisko (naDT
zapytanie), gdzieby
dostępne są zmienne. Jeśli nie zostanie tam znaleziony, wygląda w rodzicu, jego rodzicu i tak dalej w zwykły sposób R. (Cóż, również przez dziedziczony zakres złączenia, który nie jest używany w tych przykładach, ponieważ nie ma żadnychi
s).by=list(x,y,z)
oznaczałobyx
,y
iz
są dostępnej
. Aby uzyskać ogólny dostęp, są one również zapakowane.BY
. W FAQ 2.10 jest trochę historii, ale można by dodać do tego trochę jasności?data.table
. Świetnie, pomoc dokumentacyjna byłaby bardzo mile widziana. Jeszcze lepiej, jeśli chcesz dołączyć do projektu i bezpośrednio zmienić.Edytować:
Biorąc pod uwagę, jak dobrze przyjęto tę odpowiedź, przekształciłem ją w winietę pakietową, która jest teraz dostępna tutaj
Biorąc pod uwagę, jak często się to pojawia, myślę, że uzasadnia to nieco szersze wyjaśnienie, poza pomocną odpowiedzią udzieloną przez Josha O'Briena powyżej.
Oprócz S ubset części D ata skrót najczęściej cytowanym / stworzony przez Josha, myślę, że to również pomocne do rozważenia „S” stanąć na „ten sam” lub „self-reference” -
.SD
jest w swej najbardziej podstawowej guise A refleksyjne odniesienie dodata.table
samego siebie - jak zobaczymy w poniższych przykładach, jest to szczególnie przydatne przy łączeniu w łańcuch "zapytań" (używanie ekstrakcji / podzbiorów / itp[
.). W szczególności oznacza to również, że samo.SD
jest adata.table
(z zastrzeżeniem, że nie pozwala na przypisanie:=
).Prostsze użycie
.SD
służy do ustawiania podzbiorów kolumn (tj. Kiedy.SDcols
jest określony); Myślę, że ta wersja jest dużo łatwiejsza do zrozumienia, więc najpierw omówimy to poniżej. Interpretacja.SD
w drugim zastosowaniu scenariuszy grupowania (tj. Kiedyby =
lubkeyby =
jest określona) jest koncepcyjnie nieco inna (chociaż w istocie jest taka sama, ponieważ w końcu operacja niezgrupowana jest skrajnym przypadkiem grupowania z tylko jedna grupa).Oto kilka przykładów ilustracyjnych i kilka innych przykładów zastosowań, które sam często stosuję:
Ładowanie danych Lahmana
Aby nadać temu bardziej realistyczny charakter, zamiast wymyślać dane, załadujmy kilka zestawów danych o baseballu z
Lahman
:Nagi
.SD
Aby zilustrować, co mam na myśli, mówiąc o refleksyjnej naturze
.SD
, rozważmy jego najbardziej banalne użycie:Oznacza to, że właśnie wróciliśmy
Pitching
, tj. Był to zbyt rozwlekły sposób pisaniaPitching
lubPitching[]
:Jeśli chodzi o
.SD
podzbiór , to wciąż jest podzbiorem danych, to tylko trywialny (sam zestaw).Podział kolumn:
.SDcols
Pierwszym sposobem na uderzenia, co
.SD
to jest ograniczenie kolumn zawartych w.SD
użyciu.SDcols
argumentu[
:To jest tylko dla ilustracji i było dość nudne. Ale nawet to proste użycie nadaje się do szerokiej gamy bardzo korzystnych / wszechobecnych operacji manipulacji danymi:
Konwersja typu kolumny
Konwersja typu kolumny jest faktem w przypadku łączenia danych - w chwili pisania tego tekstu
fwrite
nie można automatycznie czytaćDate
aniPOSIXct
kolumn , a konwersje tam iz powrotem międzycharacter
/factor
/numeric
są powszechne. Możemy używać.SD
i.SDcols
konwertować grupy takich kolumn.Zauważamy, że następujące kolumny są przechowywane jako
character
w zestawieTeams
danych:Jeśli jesteś zdezorientowany przez użycie
sapply
tutaj, zwróć uwagę, że jest to to samo, co w przypadku podstawy Rdata.frames
:Kluczem do zrozumienia tej składni jest przypomnienie, że a
data.table
(jak również adata.frame
) można uznać za a,list
gdzie każdy element jest kolumną - w ten sposóbsapply
/lapply
stosuje sięFUN
do każdej kolumny i zwraca wynik jakosapply
/lapply
zwykle (tutajFUN == is.character
zwraca alogical
o długości 1, więcsapply
zwraca wektor).Składnia konwersji tych kolumn
factor
jest bardzo podobna - po prostu dodaj:=
operator przypisaniaZauważ, że musimy zawinąć
fkt
w nawiasy,()
aby zmusić R do interpretacji tego jako nazw kolumn, zamiast próbować przypisać nazwęfkt
do RHS.Elastyczność
.SDcols
(a:=
) przyjęciacharacter
wektor lub einteger
wektor pozycji kolumna może również się przydać do konwersji w oparciu o wzorce nazw kolumn *. Moglibyśmy przekonwertować wszystkiefactor
kolumny nacharacter
:Następnie przekonwertuj wszystkie kolumny zawierające z
team
powrotem nafactor
:** Jawne używanie numerów kolumn (takich jak
DT[ , (1) := rnorm(.N)]
) jest złą praktyką i może z czasem prowadzić do dyskretnego uszkodzenia kodu, jeśli zmieniają się pozycje kolumn. Nawet niejawne używanie liczb może być niebezpieczne, jeśli nie zachowujemy inteligentnej / ścisłej kontroli nad kolejnością, kiedy tworzymy numerowany indeks i kiedy go używamy.Kontrolowanie RHS Modela
Zmienna specyfikacja modelu jest podstawową cechą solidnej analizy statystycznej. Spróbujmy przewidzieć ERA miotacza (średnia zdobytych przebiegów, miara wydajności) przy użyciu małego zestawu zmiennych towarzyszących dostępnych w
Pitching
tabeli. Jak wygląda (liniowa) zależność między plikamiW
(wygrywa) iERA
różni się w zależności od innych zmiennych towarzyszących uwzględnionych w specyfikacji?Oto krótki skrypt wykorzystujący moc,
.SD
który bada to pytanie:Współczynnik zawsze ma oczekiwany znak (lepsi miotacze mają zwykle więcej wygranych i mniej dozwolonych przebiegów), ale wielkość może się znacznie różnić w zależności od tego, co jeszcze kontrolujemy.
Połączenia warunkowe
data.table
składnia jest piękna ze względu na swoją prostotę i solidność. Składniax[i]
elastycznie obsługuje dwa typowe podejścia do podzbioru - kiedyi
jestlogical
wektorem,x[i]
zwróci te wierszex
odpowiadające gdziei
jestTRUE
; kiedyi
jest innydata.table
,join
wykonuje się a (w zwykłej formie, używająckey
s zx
ii
przeciwnym razie, gdyon =
jest określone, przy użyciu dopasowań tych kolumn).Ogólnie jest to świetne, ale nie wystarczy, gdy chcemy wykonać sprzężenie warunkowe , w którym dokładny charakter relacji między tabelami zależy od niektórych cech wierszy w jednej lub większej liczbie kolumn.
Ten przykład jest nieco wymyślony, ale ilustruje pomysł; więcej tutaj ( 1 , 2 ).
Celem jest dodanie kolumny
team_performance
doPitching
tabeli, która rejestruje wyniki zespołu (rangę) najlepszego miotacza w każdej drużynie (mierzoną przez najniższą ERA, wśród miotaczy z co najmniej 6 zarejestrowanymi meczami).Zwróć uwagę, że
x[y]
składnia zwracanrow(y)
wartości, dlatego.SD
jest po prawej stronieTeams[.SD]
(ponieważ prawa strona:=
w tym przypadku wymaganrow(Pitching[rank_in_team == 1])
wartości..SD
Operacje zgrupowaneCzęsto chcielibyśmy wykonać pewne operacje na naszych danych na poziomie grupy . Kiedy określamy
by =
(lubkeyby =
), mentalny model tego, co dzieje się, gdydata.table
procesy,j
polega na myśleniu, żedata.table
jesteś podzielony na wiele pod-podrzędnychdata.table
, z których każda odpowiada pojedynczej wartościby
zmiennej (-ych):W tym przypadku
.SD
ma charakter wieloraki - odnosi się do każdego z tych pod-data.table
, pojedynczo (nieco dokładniej, zakres.SD
jest jednym pod-data.table
). To pozwala nam zwięźle wyrazić operację, którą chcielibyśmy wykonać na każdymdata.table
składniku, zanim ponownie złożony wynik zostanie nam zwrócony.Jest to przydatne w różnych ustawieniach, z których najczęstsze są przedstawione tutaj:
Podzbiór grupowy
Uzyskajmy dane z ostatniego sezonu dla każdej drużyny w danych Lahmana. Można to zrobić po prostu za pomocą:
Przypomnij
.SD
sobiedata.table
, że to samo jest a i.N
odnosi się do całkowitej liczby wierszy w grupie (jest równanrow(.SD)
w każdej grupie), więc.SD[.N]
zwraca całość.SD
dla ostatniego wiersza skojarzonego z każdymteamID
.Inną popularną wersją jest użycie
.SD[1L]
zamiast tego pierwszego obserwacji dla każdej grupy.Grupa Optima
Załóżmy, że chcemy zwrócić najlepszy rok dla każdego zespołu, mierzony całkowitą liczbą zdobytych runów (
R
; oczywiście możemy łatwo dostosować to, aby odnosić się do innych wskaźników). Zamiast pobierać stały element z każdego pod-data.table
, teraz dynamicznie definiujemy żądany indeks w następujący sposób:Zauważ, że to podejście można oczywiście łączyć z
.SDcols
zwracaniem tylko częścidata.table
dla każdego.SD
(z zastrzeżeniem, które.SDcols
powinno zostać naprawione w różnych podzbiorach)Uwaga :
.SD[1L]
jest obecnie zoptymalizowany przezGForce
( zobacz także )data.table
wewnętrzne elementy, które znacznie przyspieszają najczęściej wykonywane operacje grupowe, takie jaksum
lubmean
- zobacz?GForce
więcej szczegółów i miej oko na / głosową obsługę próśb o ulepszenie funkcji dla aktualizacji na tym froncie: 1 , 2 , 3 , 4 , 5 , 6Regresja grupowa
Wracając do powyższego pytania dotyczącego relacji między
ERA
iW
, przypuśćmy, że spodziewamy się, że ta relacja będzie się różnić w zależności od zespołu (tj. Dla każdego zespołu istnieje inne nachylenie). Możemy łatwo powtórzyć tę regresję, aby zbadać niejednorodność tej relacji w następujący sposób (zauważając, że standardowe błędy z tego podejścia są generalnie niepoprawne - specyfikacjaERA ~ W*teamID
będzie lepsza - to podejście jest łatwiejsze do odczytania, a współczynniki są w porządku) :Chociaż istnieje spora różnorodność, istnieje wyraźna koncentracja wokół obserwowanej wartości ogólnej
Miejmy nadzieję, że to wyjaśniło moc
.SD
ułatwienia tworzenia pięknego, wydajnego kodudata.table
!źródło
Zrobiłem o tym film po rozmowie z Mattem Dowle na temat .SD, możesz go zobaczyć na YouTube: https://www.youtube.com/watch?v=DwEzQuYfMsI
źródło