.SD
terlihat bermanfaat tetapi saya tidak benar-benar tahu apa yang saya lakukan dengannya. Apa artinya itu? Mengapa ada periode sebelumnya (berhenti penuh). Apa yang terjadi ketika saya menggunakannya?
Saya membaca:
.SD
adalah data.table
subkumpulan x
data untuk setiap grup, tidak termasuk kolom grup. Ini dapat digunakan saat pengelompokan berdasarkan i
, saat pengelompokan oleh by
, dikunci by
, dan _ad hoc_by
Apakah itu berarti bahwa anak perempuan data.table
itu disimpan dalam memori untuk operasi selanjutnya?
r
data.table
Farrel
sumber
sumber
?data.table
ditingkatkan di v1.7.10, berkat pertanyaan ini. Sekarang menjelaskan nama.SD
sesuai jawaban yang diterima.Jawaban:
.SD
singkatan sesuatu seperti "S
ubset ofD
ata.table". Tidak ada signifikansi untuk inisial"."
, kecuali bahwa itu membuat semakin tidak mungkin bahwa akan ada bentrokan dengan nama kolom yang ditentukan pengguna.Jika ini adalah data Anda. Tabel:
Melakukan ini dapat membantu Anda melihat apa
.SD
itu:Pada dasarnya,
by=y
pernyataan memecah data asli.data.tables
dan beroperasi pada gilirannya.
Saat beroperasi pada salah satu, itu memungkinkan Anda merujuk ke sub-saat ini
data.table
dengan menggunakan nama-nama / pegangan / simbol.SD
. Itu sangat berguna, karena Anda dapat mengakses dan beroperasi pada kolom sama seperti jika Anda sedang duduk di baris perintah bekerja dengan data.table tunggal yang disebut.SD
... kecuali bahwa di sini,data.table
akan melaksanakan operasi-operasi pada setiap sub tunggaldata.table
yang didefinisikan oleh kombinasi tombol, "tempel" kembali dan kembalikan hasilnya dalam satudata.table
!sumber
.SD
adalahDT[,print(.SD),by=y]
.DT[,print(.SD[,y]),by=y]
, menunjukkan bahwa saya memiliki akses ke nilaiy
, meskipun itu bukan bagian dari.SD
. Dari mana nilaiy
scoping? Apakah tersedia jika ada nilai saat iniby
?.SD[,y]
adalahdata.table
subset reguler sehingga karenay
bukan kolom.SD
yang terlihat di lingkungan yang memanggilnya, yang dalam hal ini adalahj
lingkungan (dariDT
kueri) di manaby
variabel tersedia. Jika tidak ditemukan di sana, terlihat di induk, dan induknya dan seterusnya dengan cara R biasa. (Yah, via join scope yang diwarisi juga, yang tidak digunakan dalam contoh-contoh ini karena tidak adai
s).by=list(x,y,z)
artinyax
,y
danz
tersedia untukj
. Untuk akses generik mereka juga terlibat.BY
. FAQ 2.10 memiliki beberapa riwayat di dalamnya, tetapi beberapa kejelasan dapat ditambahkan?data.table
. Hebat, bantuan docu akan sangat disambut. Lebih baik lagi jika Anda ingin bergabung dengan proyek dan berubah secara langsung.Edit:
Mengingat seberapa baik jawaban ini diterima, saya telah mengubahnya menjadi sketsa paket yang sekarang tersedia di sini
Mengingat seberapa sering ini muncul, saya pikir ini memerlukan penjelasan yang sedikit lebih banyak, di luar jawaban yang bermanfaat yang diberikan oleh Josh O'Brien di atas.
Selain S ubset dari akronim D ata yang biasanya dikutip / dibuat oleh Josh, saya pikir itu juga membantu untuk mempertimbangkan "S" untuk singkatan "Selfsame" atau "Self-reference" -
.SD
dalam kedok paling mendasar referensi refleksif terhadapdata.table
dirinya sendiri - seperti yang akan kita lihat dalam contoh di bawah ini, ini sangat membantu untuk merantai bersama "pertanyaan" (ekstraksi / subset / penggunaan menggunakan dll[
). Secara khusus, ini juga berarti bahwa.SD
itu sendiri adata.table
(dengan peringatan bahwa itu tidak memungkinkan penugasan dengan:=
).Penggunaan sederhana
.SD
adalah untuk subset kolom (yaitu, kapan.SDcols
ditentukan); Saya pikir versi ini jauh lebih mudah untuk dipahami, jadi kami akan membahasnya terlebih dahulu di bawah ini. Penafsiran.SD
dalam penggunaan kedua, skenario pengelompokan (yaitu, ketikaby =
ataukeyby =
ditentukan), sedikit berbeda, secara konseptual (meskipun pada intinya sama, karena, bagaimanapun, operasi non-kelompok adalah kasus tepi pengelompokan dengan hanya satu kelompok).Berikut adalah beberapa contoh ilustrasi dan beberapa contoh penggunaan lain yang sering saya terapkan:
Memuat Data Lahman
Untuk memberikan kesan yang lebih nyata, daripada membuat data, mari kita memuat beberapa set data tentang baseball dari
Lahman
:Telanjang
.SD
Untuk menggambarkan apa yang saya maksudkan tentang sifat refleksif
.SD
, pertimbangkan penggunaannya yang paling dangkal:Artinya, kami baru saja kembali
Pitching
, yaitu, ini adalah cara penulisan yang terlalu bertele-telePitching
atauPitching[]
:Dalam hal subsetting,
.SD
masih merupakan himpunan bagian dari data, itu hanya sepele (himpunan itu sendiri).Berlangganan Kolom:
.SDcols
Cara pertama untuk memengaruhi apa
.SD
adalah membatasi kolom yang terkandung dalam.SD
menggunakan.SDcols
argumen[
:Ini hanya untuk ilustrasi dan cukup membosankan. Tetapi bahkan penggunaan sederhana ini cocok untuk berbagai operasi manipulasi data yang sangat bermanfaat / di mana-mana:
Konversi Jenis Kolom
Konversi jenis kolom adalah fakta kehidupan untuk munging data - pada tulisan ini,
fwrite
tidak dapat secara otomatis membacaDate
atauPOSIXct
kolom , dan konversi bolak-balik antaracharacter
/factor
/numeric
adalah umum. Kita bisa menggunakan.SD
dan.SDcols
untuk mengonversi grup dalam kolom tersebut secara berkelompok.Kami perhatikan bahwa kolom berikut disimpan seperti
character
dalamTeams
kumpulan data:Jika Anda bingung dengan penggunaan di
sapply
sini, perhatikan bahwa itu sama seperti untuk basis Rdata.frames
:Kunci untuk memahami sintaks ini adalah untuk mengingat bahwa a
data.table
(dan juga adata.frame
) dapat dianggap sebagai dilist
mana setiap elemen adalah kolom - dengan demikian,sapply
/lapply
berlakuFUN
untuk setiap kolom dan mengembalikan hasilnya sepertisapply
/lapply
biasanya (di sini,FUN == is.character
mengembalikan alogical
dengan panjang 1, jadisapply
mengembalikan vektor).Sintaks untuk mengonversi kolom
factor
ini sangat mirip - cukup tambahkan:=
operator penugasanPerhatikan bahwa kita harus membungkus
fkt
tanda kurung()
untuk memaksa R untuk menafsirkan ini sebagai nama kolom, alih-alih mencoba untuk menetapkan namafkt
ke RHS.Fleksibilitas
.SDcols
(dan:=
) untuk menerimacharacter
vektor atau suatuinteger
vektor posisi kolom juga dapat berguna untuk konversi berbasis pola nama kolom *. Kami dapat mengonversi semuafactor
kolom menjadicharacter
:Dan kemudian mengonversi semua kolom yang berisi
team
kembali kefactor
:** Secara eksplisit menggunakan nomor kolom (seperti
DT[ , (1) := rnorm(.N)]
) adalah praktik yang buruk dan dapat menyebabkan kode rusak secara diam-diam seiring waktu jika posisi kolom berubah. Bahkan secara implisit menggunakan angka bisa berbahaya jika kita tidak tetap pintar / ketat mengontrol urutan ketika kita membuat indeks bernomor dan kapan kita menggunakannya.Mengontrol RHS Model
Memvariasikan spesifikasi model adalah fitur inti dari analisis statistik yang kuat. Mari kita coba dan prediksi ERA pitcher (Earned Runs Average, ukuran kinerja) menggunakan seperangkat kovariat kecil yang tersedia di
Pitching
tabel. Bagaimana hubungan (linear) antaraW
(menang) danERA
bervariasi tergantung pada kovariat mana yang termasuk dalam spesifikasi?Berikut ini skrip pendek yang memanfaatkan kekuatan
.SD
yang mengeksplorasi pertanyaan ini:Koefisien selalu memiliki tanda yang diharapkan (pitcher yang lebih baik cenderung memiliki lebih banyak kemenangan dan lebih sedikit run yang diizinkan), tetapi besarnya dapat bervariasi secara substansial tergantung pada apa lagi yang kami kontrol.
Bergabung Bersyarat
data.table
sintaksinya indah karena kesederhanaan dan kekokohannya. Sintaksx[i]
fleksibel menangani dua umum pendekatan untuk subsetting - ketikai
adalahlogical
vektor,x[i]
akan kembali orang-barisx
yang sesuai dengan manai
adalahTRUE
; kapani
yang laindata.table
, ajoin
dilakukan (dalam bentuk polos, menggunakankey
s darix
dani
, jika tidak, ketikaon =
ditentukan, menggunakan kecocokan dari kolom-kolom itu).Ini bagus secara umum, tetapi gagal ketika kita ingin melakukan join bersyarat , di mana sifat tepat hubungan di antara tabel tergantung pada beberapa karakteristik baris dalam satu atau beberapa kolom.
Contoh ini sedikit dibuat-buat, tetapi menggambarkan ide; lihat di sini ( 1 , 2 ) untuk lebih lanjut.
Tujuannya adalah untuk menambahkan kolom
team_performance
padaPitching
tabel yang mencatat kinerja tim (peringkat) dari pitcher terbaik di setiap tim (yang diukur dengan ERA terendah, di antara pitcher dengan setidaknya 6 pertandingan yang direkam).Perhatikan bahwa
x[y]
sintaks mengembalikannrow(y)
nilai, itulah sebabnya.SD
ada di sebelah kananTeams[.SD]
(karena RHS:=
dalam kasus ini membutuhkannrow(Pitching[rank_in_team == 1])
nilai..SD
Operasi yang dikelompokkanSeringkali, kami ingin melakukan beberapa operasi pada data kami di tingkat grup . Ketika kami menentukan
by =
(ataukeyby =
), model mental untuk apa yang terjadi ketikadata.table
prosesj
adalah menganggap Andadata.table
sebagai dibagi menjadi banyak komponendata.table
, yang masing-masing sesuai dengan nilai tunggalby
variabel Anda :Dalam hal ini,
.SD
sifatnya multipel - mengacu pada masing-masing sub-satu inidata.table
, satu per satu (sedikit lebih akurat, cakupannya.SD
adalah satu sub-data.table
). Ini memungkinkan kami untuk secara singkat mengekspresikan operasi yang ingin kami lakukan pada setiap sub-data.table
sebelum hasil yang dirakit dikembalikan kepada kami.Ini berguna dalam berbagai pengaturan, yang paling umum disajikan di sini:
Berlangganan Grup
Mari kita dapatkan data musim terbaru untuk setiap tim di data Lahman. Ini dapat dilakukan cukup sederhana dengan:
Ingat itu
.SD
sendiri adalah adata.table
, dan yang.N
mengacu pada jumlah total baris dalam suatu kelompok (sama dengannrow(.SD)
dalam setiap grup), jadi.SD[.N]
kembalikan keseluruhan.SD
untuk baris terakhir yang terkait dengan masing-masingteamID
.Versi umum lain dari ini adalah menggunakan
.SD[1L]
sebagai gantinya untuk mendapatkan pengamatan pertama untuk setiap kelompok.Optima Grup
Misalkan kita ingin mengembalikan tahun terbaik untuk masing-masing tim, yang diukur dengan jumlah total skor lari mereka (
R
; kita dapat dengan mudah menyesuaikan ini dengan merujuk pada metrik lain, tentu saja). Alih-alih mengambil elemen tetap dari setiap sub-data.table
, kami sekarang mendefinisikan indeks yang diinginkan secara dinamis sebagai berikut:Perhatikan bahwa pendekatan ini tentu saja dapat digabungkan dengan
.SDcols
hanya mengembalikan porsidata.table
masing-masing.SD
(dengan peringatan yang.SDcols
harus diperbaiki di berbagai subset)NB :
.SD[1L]
saat ini dioptimalkan olehGForce
( lihat juga ),data.table
internal yang secara besar-besaran mempercepat operasi yang dikelompokkan yang paling umum sepertisum
ataumean
- lihat?GForce
untuk detail lebih lanjut dan perhatikan / dukungan suara untuk permintaan peningkatan fitur untuk pembaruan di bagian depan ini: 1 , 2 , 3 , 4 , 5 , 6Regresi Kelompok
Kembali ke pertanyaan di atas mengenai hubungan antara
ERA
danW
, misalkan kita mengharapkan hubungan ini berbeda oleh tim (yaitu, ada kemiringan yang berbeda untuk setiap tim). Kita dapat dengan mudah menjalankan kembali regresi ini untuk mengeksplorasi heterogenitas dalam hubungan ini sebagai berikut (mencatat bahwa kesalahan standar dari pendekatan ini umumnya salah - spesifikasinyaERA ~ W*teamID
akan lebih baik - pendekatan ini lebih mudah dibaca - koefisiennya lebih baik) :Meskipun ada cukup heterogenitas, ada konsentrasi yang berbeda di sekitar nilai keseluruhan yang diamati
Semoga ini telah menjelaskan kekuatan
.SD
dalam memfasilitasi kode yang indah dan efisiendata.table
!sumber
Saya membuat video tentang ini setelah berbicara dengan Matt Dowle tentang .SD, Anda dapat melihatnya di YouTube: https://www.youtube.com/watch?v=DwEzQuYfMsI
sumber