Lembaran cheat data R yang muktamad

Kepantasan. Sintaksis ringkas. Keserasian ke belakang.

Tetapi terutamanya kelajuan.

Itulah beberapa ciri yang menjadikan data R.table menarik untuk peminatnya.

Dan walaupun anda pengguna rapi yang disahkan (seperti saya), data.table boleh menjadi tambahan berguna pada toolkit R anda - terutamanya ketika bekerja dengan set data yang besar, dalam aplikasi Shiny, atau dalam fungsi paket. 

Lembaran cheat muktamad data R ini berbeza dengan yang lain kerana interaktif. Anda boleh mencari frasa tertentu seperti menambah lajur atau mengikut jenis kumpulan tugas seperti Subset atau Reshape . Selain itu, kerana cheat sheet ini merangkumi kod "terjemahan" yang rapi, anda juga dapat mencari kata kerja dplyr kegemaran seperti mutasi atau berturut-turut .

Pengguna yang berdaftar boleh memuat turun versi yang diperluas dari jadual interaktif ini untuk digunakan pada sistem mereka sendiri! Pendaftaran adalah percuma. 

Cari data. Tugas dan kod yang rapi dan rapi

Tugas Jenis data.kod meja Kod Tidyverse
Baca dalam fail CSV Import mydt <- fread ("myfile.csv") myt <- read_csv ("myfile.csv") #OR myt <- vroom :: vroom ("myfile.csv")
Import bilangan x baris pertama fail CSV Import mydt_x <- fread ("myfile.csv", nrows = x) myt_x <- read_csv ("myfile.csv", n_max = x)
Import hanya baris tersebut dari fail CSV yang sesuai dengan corak tertentu Import mydt_pattern <- fread ("grep 'mypattern' myfile.csv") myt_pattern <- vroom :: vroom (paip ("grep 'mypattern' myfile.csv"))
Import fail mampat .gz Import mydt <- fread ("myfile.gz") myt <- vroom :: vroom ("myfile.gz")
Import fail termampat a.zip mengimport mydt <- fread (cmd = 'unzip -cq myfile.zip') myt - baca_csv ("myfile.zip")
Buat jadual data dari bingkai data yang ada (tibble for tidyverse) Import mydt <- as.data.table (mydf) #OR

setDT (mydf)

myt - as_tibble (mydf)
Mengubah data. Meja di tempat tanpa membuat salinan Kekusutan sebarang fungsi yang bermula dengan set seperti setkey (mydt, mycol) atau menggunakan: = operator dalam kurungan tidak berkenaan
Susun baris berdasarkan beberapa nilai lajur Kekusutan mydt2 <- mydt [pesanan (colA, -colB)] #OR

setorder (mydt, colA, -colB)

myt <- susun (myt, colA, -colB)
Namakan semula lajur Kekusutan setnames (mydt, old = c ('colA', 'colB'), baru = c ('NewColA', 'NewColB')) myt <- rename (myt, NewColA = colA, NewColB = colB)
Menyusun semula lajur: Pindahkan beberapa lajur ke kedudukan depan (paling kiri) Kekusutan setcolorder (mydt, c ("colB", "colC")) # colB sekarang di posisi 1 dan colC di posisi 2 myt - relokasi (myt, colB, colC)
Tapis baris untuk nombor baris n Subset mydt2 <- mydt [n] myt2 <- slice (myt, n)
Tapis untuk baris terakhir Subset mydt2 <- mydt [.N] myt2 <- slice (myt, n ())
Tapis baris mengikut keadaan Subset # Dalam beberapa kes, setkey (mydt, colA, colB) akan mempercepat prestasi # untuk ujian logik pada colA dan colB; sama dengan lajur lain

mydt2 <- mydt [ungkapan logik]

myt2 <- filter (myt, ungkapan logik)
Tapis baris di mana colA sama dengan string1 atau string2 Subset mydt2 <- mydt [colA% chin% c ("string1", "string2")] myt2 <- filter (myt, colA% in% c ("string1", "string2"))
Tapis baris di mana colA sepadan dengan ungkapan biasa Subset mydt2 <- mydt [colA% like% "mypattern"] myt2 <- filter (myt, stringr :: str_detect (colA, "mypattern"))
Tapis baris dengan nilai colA antara 2 nombor Subset mydt2 <- mydt [colA% antara% c (n1, n2)] myt2 <- filter (myt, antara (colA, n1, n2))
Tapis untuk baris n pertama mengikut kumpulan Subset mydt2 <- mydt [, .SD [1: n], oleh = groupcol] myt2% group_by (groupcol)%>% kepingan (1: n)
Tapis baris untuk nilai maksimum mengikut kumpulan Subset mydt2 <- mydt [, .SD [which.max (valcol)], oleh = groupcol] myt2% group_by (groupcol)%>% filter (valcol == max (valcol))
Pilih lajur dan hasil kembali sebagai vektor Subset myvec <- mydt [, nama panggilan] myvec <- tarik (myt, nama panggilan)
Pilih beberapa lajur untuk membuat data baru. Meja (bingkai data atau tibble untuk tidyverse) Subset mydt2 <- mydt [, list (colA, colB)] #OR

mydt2 <- mydt [,. (colA, colB)] #OR

mydt2 <- mydt [, c ("colA", "colB")]

myt2 <- pilih (myt, colA, colB)
Pilih beberapa lajur menggunakan pemboleh ubah yang mengandungi nama lajur Subset my_col_names <- c ("colA", "colB")

mydt2 <- mydt [, ..my_col_names] #OR

mydt2 <- mydt [, my_col_names, dengan = FALSE]

my_col_names <- c ("colA", "colB")

myt2 <- pilih (myt, all_of (my_col_names))

Pilih beberapa lajur dan ganti nama beberapa Subset mydt2 <- mydt [,. (nama baru1 = col1, nama baru2 = col2, col3)] myt2 <- pilih (myt, nama baru1 = col1, nama baru2 = col2, col3)
Kecualikan beberapa lajur Subset mydt2 <- mydt [, -c ("colA", "colB")] #OR

mydt2 <- mydt [,! c ("colA", "colB")] #OR

my_col_names <- c ("colA", "colB")

mydt2 <- mydt [,! .. my_col_names]

myt2 <- pilih (myt, -c (colA, colB)) #OR

my_col_names <- c ("colA", "colB")

myt2 <- pilih (myt, - {{my_col_names}})

Keluarkan baris pendua berdasarkan nilai dalam beberapa lajur Subset mydt2 <- unik (mydt, by = c ("colA", "colB")) myt2 <- berbeza (myt, colA, colB, .keep_all = TRUE)
Hitung baris unik berdasarkan beberapa lajur Ringkaskan unikN (mydt, by = c ("colA", "colB")) nrow (berbeza (myt, colA, colB))
Jalankan pengiraan ringkasan data Ringkaskan mydt2 <- mydt [, myfun (colA ...)] ringkasan myt2% (ColName = myfun (colA ...))
Jalankan pengiraan ringkasan data oleh satu kumpulan Ringkaskan mydt2 <- mydt [, myfun (colA ...), oleh = groupcol] myt2%

group_by (groupcol)%>%

ringkaskan (

NewCol = myfun (colA ...)

)

Jalankan pengiraan ringkasan data oleh satu kumpulan dan namakan lajur baru Ringkaskan mydt2 <- mydt [,. (MyNewCol = myfun (colA ...)), oleh = groupcol] myt2%

group_by (groupcol)%>%

ringkaskan (

NewCol = myfun (colA ...)

)

Jalankan pengiraan ringkasan data oleh pelbagai kumpulan Ringkaskan mydt2 <- mydt [, myfun (colA ...), oleh =. (groupcol1, groupcol2)] myt2%

group_by (groupcol1, groupcol2)%>%

ringkaskan (

NewCol = myfun (colA ...)

)

Jalankan pengiraan ringkasan pada data yang ditapis oleh pelbagai kumpulan Ringkaskan mydt2 <- mydt [ungkapan penapis, myfun (colA), oleh =. (groupcol1, groupcol2)] myt2%

penapis (ungkapan penapis)%>%

group_by (groupcol1, groupcol2)%>%

ringkaskan (

NewCol = myfun (colA), .group = "simpan"

)

Hitung bilangan baris mengikut kumpulan Ringkaskan mydt2 <- mydt [,. N, by = groupcol] #untuk satu kumpulan #OR

mydt2 <- mydt [, .N, by =. (groupcol1, groupcol2)]

myt2 <- hitung (myt, groupcol) #untuk satu kumpulan #OR

myt2 <- hitungan (myt, groupcol1, groupcol2)

Ringkaskan beberapa lajur dan pulangkan hasil dalam beberapa lajur Ringkaskan mydt2 <- mydt [, lapply (.SD, myfun),

.SDcols = c ("colA", "colB")]

myt2%

ringkaskan (

seberang (c (colA, colB), myfun)

)

Ringkaskan beberapa lajur mengikut kumpulan dan kembalikan hasil dalam beberapa lajur Ringkaskan mydt2 <- mydt [, lapply (.SD, myfun),

.SDcols = c ("colA", "colB"), oleh = groupcol]

myt2%

group_by (groupcol)%>%

ringkaskan (seberang (c (colA, colB), myfun))

Tambahkan lajur Kira mydt [, MyNewCol: = myfun (colA)] %%

bermutasi (

MyNewCol = myfun (colA)

)

Tambahkan beberapa lajur sekaligus Kira # gunakan sebarang fungsi atau ungkapan

mydt [, `: =` (NewCol1 = myfun (colA), NewCol2 = colB + colC)] #OR

mydt [, c ("NewCol1", "newCol2"): = senarai (myfun (colA), colB + colC)]

%%

bermutasi (

MyNewCol1 = myfun (colA),

MyNewCol2 = colB + colC

)

Tambahkan lajur menggunakan nilai semasa dan sebelumnya dari lajur lain, seperti mencari perbezaan antara nilai pada tarikh berbanding tarikh sebelumnya Kira mydt [, Diff: = colA - shift (colA)] myt <- mutate (myt, Diff = colA - lag (colA))
Tambahkan lajur yang merujuk nilai sebelumnya lajur oleh kumpulan Kira mydt2 <- mydt [, Diff: = colA - shift (colA), oleh = groupcol] myt2% group_by (groupcol)%>% mutate (Diff = colA - lag (colA))
Tambahkan lajur dengan nombor ID baris mengikut kumpulan Kira mydt [, myid: = 1: .N, oleh = groupcol] myt% group_by (groupcol)%>% mutate (myid = baris_number ())
Tambahkan lajur berdasarkan beberapa keadaan tanpa menggunakan beberapa pernyataan jika lain (seperti SQL's CASE) Kira # Memerlukan data.table versi 1.13 atau lebih baru

# Saya suka setiap syarat pada baris baru tetapi itu tidak diperlukan

mydt2 <- mydt [, NewCol: = fcase (

syarat1, "Nilai1",

syarat2, "Nilai2",

condition3, "Nilai3",

default = "Other" # nilai untuk semua yang lain

)]

myt2%

bermutasi (

NewCol = case_ ketika (

syarat1 ~ "Nilai1",

syarat2 ~ "Nilai2",

syarat3 ~ "Nilai3",

BENAR ~ "Lain"

)

)

Tambahkan lajur melalui operasi mengikut baris Kira mydt [, newcol: = myfun (colB, colC, colD), oleh = 1: nrow (mydt)]

# atau jika colA mempunyai semua nilai unik

mydt [, newcol: = myfun (colB, colC, colD), oleh = colA]

%%

berturut-turut ()%>%

bermutasi (

newcol = myfun (colB, colC, colD)

)

# atau

%%

berturut-turut ()%>%

bermutasi (

#use dplyr pilih sintaks:

newcol = myfun (c_across (colB: colD)))

)

Sertailah dua set data dengan lebih daripada satu lajur; simpan semua dalam set1 tetapi hanya sepadan di set2 Sertailah mydt <- dt2 [dt1, on = c ("dt2col" = "dt1col")] #OR

mydt <- penggabungan (dt1, dt2, by.x = "dt1col", by.y = "dt2col", all.x = TRUE) #OR

setkey (dt1, "dt1col") setkey (dt2, "dt2col") mydt <- dt2 [dt1]

myt <- left_join (df1, df2, by = c ("df1col" = "df2col"))
Sertailah 2 set data dengan lebih dari satu lajur - simpan semua di set1 tetapi hanya sesuai di set2 Sertailah mydt <- merge (dt1, dt2, by.x = c ("dt1colA", "dt1colB"), by.y = c ("dt2colA", "dt2colB"), all.x = TRUE, all.y = PALSU ) #OR

setkey (dt1, dt1colA, dt1colB)

setkey (dt2, dt2colA, dt2colB)

mydt <- dt2 [dt1]

myt <- left_join (df1, df2, by = c ("df1colA" = "df2colA", "df1colB" = "df2colB"))
Sertailah dua set data dengan satu lajur biasa; hanya menjaga pertandingan Sertailah mydt <- penggabungan (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2") myt <- inner_join (df1, df2, by = c ("df1col" = "df2col"))
Sertailah dua set data dengan satu lajur biasa dan simpan semua data dalam kedua-dua set, sama ada ada padanan atau tidak Sertailah mydt <- penggabungan (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2", all = TRUE) myt <- full_join (df1, df2, by = c ("df1col" = "df2col"))
Gabungkan dua set data dengan menambahkan baris dari satu ke bahagian bawah yang lain Sertailah mydt_joined <- rbindlist (senarai (mydt, mydt2)) myt_joined <- bind_rows (myt, myt2)
Bentuk semula data dari panjang ke panjang Bentuk semula mydt_long <- melt (mydt, mengukur.vars = c ("col1", "col2", "col3"), variable.name = "NewCategoryColName", value.name = "NewValueColName") myt_long <- pivot_longer (myt, cols = begin_with ("col"), names_to = "NewCategoryColName", nilai_to = "NewValueColName")
Bentuk semula data dari panjang ke lebar Bentuk semula mydt_wide <- dcast (mydt, id_col1 ~ col1, value.var = "ValueColName") myt_wide <- pivot_wider (myt, names_from = col1, values_from = ValueColName)
Rantai pelbagai ungkapan Kekusutan mydt [expr1] [expr2] %%

expr1%>%

expr2

Eksport data ke fail CSV Eksport fwrite (mydt, "myfile.csv") write_csv (myt, "myfile.csv")
Tambahkan baris ke fail CSV yang ada Eksport fwrite (mydt2, "myfile.csv", lampiran = BENAR) vroom :: vroom_write (myt2, "myfile.csv", delim = ",", tambahkan = BENAR)
Eksport data ke fail CSV yang dimampatkan Eksport fwrite (mydt, "myfile.csv.gz", kompres = "gzip") vroom :: vroom_write (myt, "myfile2.csv.gz")

Terdapat banyak lagi yang perlu dipelajari mengenai data.tabel! Untuk beberapa asas data. Jadual, lihat video pengenalan lima minit saya:

Akhirnya, laman web data.table mempunyai lebih banyak maklumat dan petua, seperti menggunakan setkey()dan petua pengindeksan lain.