Προγραμματισμός

Το απόλυτο φύλλο εξαπάτησης R data.table

Ταχύτητα. Συνοπτική σύνταξη. Συμβατότητα προς τα πίσω.

Αλλά ειδικά η ταχύτητα.

Αυτές είναι μερικές από τις δυνατότητες που κάνουν τα δεδομένα του R. πίνακα συναρπαστικά για τους θαυμαστές του.

Και ακόμη και αν είστε επιβεβαιωμένος τακτοποιημένος χρήστης (όπως είμαι), το data.table μπορεί να είναι μια χρήσιμη προσθήκη στο R toolkit σας - ειδικά όταν εργάζεστε με μεγάλα σύνολα δεδομένων, σε μια εφαρμογή Shiny ή σε μια λειτουργία πακέτου.

Αυτό το τελικό φύλλο εξαπάτησης R data.table είναι διαφορετικό από πολλά άλλα επειδή είναι διαδραστικός. Μπορείτε να αναζητήσετε μια συγκεκριμένη φράση όπως προσθήκη στήλης ή από έναν τύπο ομάδας εργασιών όπως Υποσύνολο ή Αναπλάσσω. Επιπλέον, επειδή αυτό το φύλλο εξαπάτησης περιλαμβάνει tidyverse κωδικό «μετάφρασης», μπορείτε επίσης να αναζητήσετε ένα αγαπημένο ρήμα dplyr όπως αλλάσσω ή προς τα δεξιά.

Οι εγγεγραμμένοι χρήστες μπορούν να κατεβάσουν μια εκτεταμένη έκδοση αυτού του διαδραστικού πίνακα για χρήση στα δικά τους συστήματα! Η εγγραφή είναι δωρεάν.

Αναζήτηση δεδομένων. Πίνακας και τακτοποιημένες εργασίες και κώδικας

ΕργοΤύποςdata.table ΚωδικόςΚωδικός Tidyverse
Διαβάστε σε αρχείο CSVΕισαγωγήmydt <- fread ("myfile.csv")myt <- read_csv ("myfile.csv") #OR myt <- vroom :: vroom ("myfile.csv")
Εισαγάγετε τον πρώτο x αριθμό σειρών ενός αρχείου CSVΕισαγωγήmydt_x <- fread ("myfile.csv", nrows = x)myt_x <- read_csv ("myfile.csv", n_max = x)
Εισαγάγετε μόνο αυτές τις σειρές από ένα αρχείο CSV που ταιριάζει με ένα συγκεκριμένο μοτίβοΕισαγωγήmydt_pattern <- fread ("grep 'mypattern' myfile.csv")myt_pattern <- vroom :: vroom (σωλήνας ("grep 'mypattern' myfile.csv"))
Εισαγωγή συμπιεσμένου αρχείου .gzΕισαγωγήmydt <- fread ("myfile.gz")myt <- vroom :: vroom ("myfile.gz")
Εισαγωγή συμπιεσμένου αρχείου a.zipεισαγωγήmydt <- fread (cmd = 'unzip -cq myfile.zip')myt <- read_csv ("myfile.zip")
Δημιουργία πίνακα δεδομένων από το υπάρχον πλαίσιο δεδομένων (ανατροπή για tidyverse)Εισαγωγήmydt <- as.data.table (mydf) #OR

setDT (mydf)

myt <- as_tibble (mydf)
Αλλάξτε τα δεδομένα. Πίνακας στη θέση του χωρίς δημιουργία αντιγράφουΛογομαχίαοποιαδήποτε λειτουργία που ξεκινά με σετ όπως setkey (mydt, mycol) ή χρησιμοποιώντας το: = χειριστή μέσα σε αγκύλεςΔεν εφαρμόζεται
Παραγγελία σειρών με βάση πολλές τιμές στηλώνΛογομαχίαmydt2 <- mydt [παραγγελία (colA, -colB)] #OR

setorder (mydt, colA, -colB)

myt <- τακτοποίηση (myt, colA, -colB)
Μετονομασία στηλώνΛογομαχίαsetnames (mydt, old = c ('colA', 'colB'), new = c ('NewColA', 'NewColB'))myt <- μετονομασία (myt, NewColA = colA, NewColB = colB)
Αναδιάταξη στηλών: Μετακινήστε μερικές στήλες στην μπροστινή (αριστερή-πιο) θέσηΛογομαχίαsetcolorder (mydt, c ("colB", "colC")) # colB τώρα στη θέση 1 και colC στη θέση 2myt - μετεγκατάσταση (myt, colB, colC)
Φιλτράρετε σειρές για τον αριθμό σειράς nΥποσύνολοmydt2 <- mydt [n]myt2 <- φέτα (myt, n)
Φιλτράρισμα για την τελευταία σειράΥποσύνολοmydt2 <- mydt [.N]myt2 <- slice (myt, n ())
Φιλτράρετε σειρές κατά συνθήκηΥποσύνολο# Σε ορισμένες περιπτώσεις, το setkey (mydt, colA, colB) θα επιταχύνει την απόδοση # για λογικές δοκιμές σε colA και colB. ίδιο με άλλες στήλες

mydt2 <- mydt [λογική έκφραση]

myt2 <- φίλτρο (myt, λογική έκφραση)
Φιλτράρετε σειρές όπου το colA ισούται με το string1 ή το string2Υποσύνολοmydt2 <- mydt [colA% chin% c ("string1", "string2")]myt2 <- φίλτρο (myt, colA% σε% c ("string1", "string2"))
Φιλτράρετε σειρές όπου το colA ταιριάζει με μια κανονική έκφρασηΥποσύνολοmydt2 <- mydt [colA% like% "mypattern"]myt2 <- φίλτρο (myt, stringr :: str_detect (colA, "mypattern"))
Φιλτράρετε σειρές όπου οι τιμές colA κυμαίνονται μεταξύ 2 αριθμώνΥποσύνολοmydt2 <- mydt [colA% μεταξύ% c (n1, n2)]myt2 <- φίλτρο (myt, μεταξύ (colA, n1, n2))
Φιλτράρετε για τις πρώτες σειρές ανά ομάδαΥποσύνολοmydt2 <- mydt [, .SD [1: n], by = groupcol]myt2% group_by (groupcol)%>% slice (1: n)
Φιλτράρετε σειρές για μέγιστη τιμή ανά ομάδαΥποσύνολοmydt2 <- mydt [, .SD [which.max (valcol)], by = groupcol]myt2% group_by (groupcol)%>% φίλτρο (valcol == max (valcol))
Επιλέξτε στήλη και επιστρέψτε τα αποτελέσματα ως διάνυσμαΥποσύνολοmyvec <- mydt [, όνομα χρήστη]myvec <- τραβήξτε (myt, colname)
Επιλέξτε πολλές στήλες για να δημιουργήσετε ένα νέο data.table (πλαίσιο δεδομένων ή κασέτα για tidyverse)Υποσύνολοmydt2 <- mydt [, list (colA, colB)] #OR

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

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

myt2 <- select (myt, colA, colB)
Επιλέξτε πολλές στήλες χρησιμοποιώντας μια μεταβλητή που περιέχει τα ονόματα των στηλώνΥποσύνολοmy_col_names <- c ("colA", "colB")

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

mydt2 <- mydt [, my_col_names, με = FALSE]

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

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

Επιλέξτε πολλές στήλες και μετονομάστε μερικέςΥποσύνολοmydt2 <- mydt [,. (newname1 = col1, newname2 = col2, col3)]myt2 <- select (myt, newname1 = col1, newname2 = col2, col3)
Εξαίρεση πολλών στηλώνΥποσύνολοmydt2 <- mydt [, -c ("colA", "colB")] #OR

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

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

mydt2 <- mydt [,! .. my_col_names]

myt2 <- επιλέξτε (myt, -c (colA, colB)) #OR

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

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

Καταργήστε διπλές σειρές με βάση τις τιμές σε πολλές στήλεςΥποσύνολοmydt2 <- μοναδικό (mydt, by = c ("colA", "colB"))myt2 <- ξεχωριστό (myt, colA, colB, .keep_all = TRUE)
Μετρήστε μοναδικές σειρές με βάση πολλές στήλεςΣυνοψίζωuniqueN (mydt, by = c ("colA", "colB"))nrow (διακριτό (myt, colA, colB))
Εκτελέστε συνοπτικούς υπολογισμούς σε δεδομέναΣυνοψίζωmydt2 <- mydt [, myfun (colA ...)]σύνοψη myt2% (ColName = myfun (colA ...))
Εκτελέστε συνοπτικούς υπολογισμούς σε δεδομένα από μία ομάδαΣυνοψίζωmydt2 <- mydt [, myfun (colA ...), από = groupcol] myt2%

group_by (groupcol)%>%

συνοψίζω(

NewCol = myfun (colA ...)

)

Εκτελέστε συνοπτικούς υπολογισμούς σε δεδομένα από μία ομάδα και ονομάστε νέα στήληΣυνοψίζωmydt2 <- mydt [,. (MyNewCol = myfun (colA ...)), από = groupcol]myt2%

group_by (groupcol)%>%

συνοψίζω(

NewCol = myfun (colA ...)

)

Εκτελέστε συνοπτικούς υπολογισμούς σε δεδομένα από πολλές ομάδεςΣυνοψίζωmydt2 <- mydt [, myfun (colA ...), by =. (groupcol1, groupcol2)]myt2%

group_by (groupcol1, groupcol2)%>%

συνοψίζω(

NewCol = myfun (colA ...)

)

Εκτελέστε συνοπτικό υπολογισμό σε φιλτραρισμένα δεδομένα από πολλές ομάδεςΣυνοψίζωmydt2 <- mydt [έκφραση φίλτρου, myfun (colA), κατά =. (groupcol1, groupcol2)]myt2%

φίλτρο (έκφραση φίλτρου)%>%

group_by (groupcol1, groupcol2)%>%

συνοψίζω(

NewCol = myfun (colA), .groups = "κρατήστε"

)

Μετρήστε τον αριθμό σειρών ανά ομάδεςΣυνοψίζωmydt2 <- mydt [,. N, by = groupcol] # για μία ομάδα #OR

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

myt2 <- count (myt, groupcol) # για μία ομάδα #OR

myt2 <- count (myt, groupcol1, groupcol2)

Συνοψίστε πολλές στήλες και επιστρέψτε τα αποτελέσματα σε πολλές στήλεςΣυνοψίζωmydt2 <- mydt [, lapply (.SD, myfun),

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

myt2%

συνοψίζω(

απέναντι (c (colA, colB), myfun)

)

Συνοψίστε πολλές στήλες ανά ομάδα και επιστρέψτε τα αποτελέσματα σε πολλές στήλεςΣυνοψίζωmydt2 <- mydt [, lapply (.SD, myfun),

.SDcols = c ("colA", "colB"), από = groupcol]

myt2%

group_by (groupcol)%>%

σύνοψη (απέναντι (c (colA, colB), myfun))

Προσθέστε μια στήληΥπολογίζωmydt [, MyNewCol: = myfun (colA)] % μου

αλλάσσω(

MyNewCol = myfun (colA)

)

Προσθέστε πολλές στήλες ταυτόχροναΥπολογίζω# χρησιμοποιήστε οποιαδήποτε συνάρτηση ή έκφραση

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

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

% μου

αλλάσσω(

MyNewCol1 = myfun (colA),

MyNewCol2 = colB + colC

)

Προσθέστε στήλη χρησιμοποιώντας τρέχουσες και προηγούμενες τιμές από άλλη στήλη, όπως εύρεση της διαφοράς μεταξύ της τιμής σε μια ημερομηνία έναντι της προηγούμενης ημερομηνίαςΥπολογίζωmydt [, Diff: = colA - shift (colA)]myt <- mutate (myt, Diff = colA - lag (colA))
Προσθέστε στήλη που αναφέρεται στην προηγούμενη τιμή μιας στήλης από μια ομάδαΥπολογίζωmydt2 <- mydt [, Diff: = colA - shift (colA), by = groupcol]myt2% group_by (groupcol)%>% mutate (Diff = colA - lag (colA))
Προσθέστε στήλη με αριθμούς ID σειράς ανά ομάδαΥπολογίζωmydt [, myid: = 1: .N, by = groupcol]myt% group_by (groupcol)%>% μετάλλαξη (myid = row_number ())
Προσθέστε στήλη βάσει πολλών συνθηκών χωρίς να χρησιμοποιήσετε πολλαπλές δηλώσεις αν αλλιώς (όπως το SQL's CASE)Υπολογίζω# Χρειάζεται data.table έκδοση 1.13 ή μεταγενέστερη

# Μου αρέσει κάθε συνθήκη σε μια νέα γραμμή, αλλά αυτό δεν απαιτείται

mydt2 <- mydt [, NewCol: = fcase (

συνθήκη1, "Value1",

συνθήκη2, "Value2",

condition3, "Value3",

default = "Other" # τιμή για όλα τα άλλα

)]

myt2%

αλλάσσω(

NewCol = περίπτωση_ όταν (

condition1 ~ "Value1",

condition2 ~ "Value2",

condition3 ~ "Value3",

ΑΛΗΘΕΙΑ ~ "Άλλο"

)

)

Προσθήκη στήλης μέσω λειτουργίας κατά σειράΥπολογίζωmydt [, newcol: = myfun (colB, colC, colD), κατά = 1: nrow (mydt)]

# ή εάν το colA έχει όλες τις μοναδικές τιμές

mydt [, newcol: = myfun (colB, colC, colD), από = colA]

% μου

δεξιόστροφα ()%>%

αλλάσσω(

newcol = myfun (colB, colC, colD)

)

# ή

% μου

δεξιόστροφα ()%>%

αλλάσσω(

#use dplyr επιλέξτε σύνταξη:

newcol = myfun (c_across (colB: colD))

)

Συμμετοχή σε δύο σύνολα δεδομένων με περισσότερες από μία στήλες. κρατήστε όλα στο set1 αλλά μόνο ταιριάζει στο set2Συμμετοχήmydt <- dt2 [dt1, on = c ("dt2col" = "dt1col")] #OR

mydt <- συγχώνευση (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"))
Συμμετοχή σε 2 σύνολα δεδομένων με περισσότερες από μία στήλες - διατηρήστε όλα στο set1 αλλά αντιστοιχούν μόνο στο set2Συμμετοχήmydt <- merge (dt1, dt2, by.x = c ("dt1colA", "dt1colB"), by.y = c ("dt2colA", "dt2colB"), all.x = TRUE, all.y = FALSE ) #Ή

setkey (dt1, dt1colA, dt1colB)

setkey (dt2, dt2colA, dt2colB)

mydt <- dt2 [dt1]

myt <- left_join (df1, df2, by = c ("df1colA" = "df2colA", "df1colB" = "df2colB"))
Συμμετοχή σε δύο σύνολα δεδομένων με μία κοινή στήλη. κρατήστε μόνο αγώνεςΣυμμετοχήmydt <- συγχώνευση (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2")myt <- inner_join (df1, df2, by = c ("df1col" = "df2col"))
Συμμετέχετε σε δύο σύνολα δεδομένων με μία κοινή στήλη και διατηρήστε όλα τα δεδομένα και στα δύο σύνολα, ανεξάρτητα από το αν υπάρχουν ή όχιΣυμμετοχήmydt <- συγχώνευση (dt1, dt2, by.x = "dtcol1", by.y = "dtcol2", all = TRUE)myt <- full_join (df1, df2, by = c ("df1col" = "df2col"))
Συνδυάστε δύο σύνολα δεδομένων προσθέτοντας σειρές από το ένα στο κάτω μέρος του άλλουΣυμμετοχήmydt_joined <- rbindlist (λίστα (mydt, mydt2))myt_joined <- bind_rows (myt, myt2)
Αναμορφώστε τα δεδομένα ευρεία σε μεγάληΑναπλάσσω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", Values_to = "ΝέαValueColName")
Αναμορφώστε τα δεδομένα σε μεγάλη έως ευρείαΑναπλάσσωmydt_wide <- dcast (mydt, id_col1 ~ col1, value.var = "ValueColName")myt_wide <- pivot_wider (myt, names_from = col1, values_from = ValueColName)
Αλυσίδα πολλαπλών εκφράσεωνΛογομαχίαmydt [expr1] [expr2]% μου

expr1%>%

expr2

Εξαγωγή δεδομένων σε αρχείο CSVΕξαγωγήfwrite (mydt, "myfile.csv")write_csv (myt, "myfile.csv")
Προσάρτηση σειρών σε ένα υπάρχον αρχείο CSVΕξαγωγήfwrite (mydt2, "myfile.csv", append = TRUE)vroom :: vroom_write (myt2, "myfile.csv", delim = ",", append = TRUE)
Εξαγωγή δεδομένων σε συμπιεσμένο αρχείο CSVΕξαγωγήfwrite (mydt, "myfile.csv.gz", compress = "gzip")vroom :: vroom_write (myt, "myfile2.csv.gz")

Υπάρχουν πολλά περισσότερα για να μάθετε για το data.table! Για ορισμένα βασικά δεδομένα. Δείτε το εισαγωγικό βίντεο πέντε λεπτών:

Τέλος, ο ιστότοπος data.table έχει πολλές περισσότερες πληροφορίες και συμβουλές, όπως τη χρήση κλειδί () και άλλες συμβουλές ευρετηρίου.