Ταχύτητα. Συνοπτική σύνταξη. Συμβατότητα προς τα πίσω.
Αλλά ειδικά η ταχύτητα.
Αυτές είναι μερικές από τις δυνατότητες που κάνουν τα δεδομένα του 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 στη θέση 2 | myt - μετεγκατάσταση (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 έχει πολλές περισσότερες πληροφορίες και συμβουλές, όπως τη χρήση κλειδί ()
και άλλες συμβουλές ευρετηρίου.