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

R data.table σύμβολα και τελεστές που πρέπει να γνωρίζετε

Ο κωδικός R data.table γίνεται πιο αποτελεσματικός - και κομψός - όταν εκμεταλλευτείτε τα ειδικά σύμβολα και τις λειτουργίες του. Έχοντας αυτό κατά νου, θα εξετάσουμε ορισμένους ειδικούς τρόπους υποσύνολο, καταμέτρηση και δημιουργία νέων στηλών.

Για αυτήν την επίδειξη, θα χρησιμοποιήσω δεδομένα από την έρευνα προγραμματιστών Stack Overflow 2019, με περίπου 90.000 απαντήσεις. Εάν θέλετε να ακολουθήσετε, μπορείτε να κατεβάσετε τα δεδομένα από το Stack Overflow.

Εάν το πακέτο data.table δεν είναι εγκατεστημένο στο σύστημά σας, εγκαταστήστε το από το CRAN και στη συνέχεια φορτώστε το ως συνήθως με βιβλιοθήκη (data.table). Για να ξεκινήσετε, ίσως θελήσετε να διαβάσετε μόνο τις πρώτες σειρές του συνόλου δεδομένων για να διευκολύνετε την εξέταση της δομής δεδομένων. Μπορείτε να το κάνετε αυτό με τα data.table's δίχτυ () λειτουργία και το στενεύει διαφωνία. Θα διαβάσω σε 10 σειρές:

data_sample <- fread ("δεδομένα / survey_results_public.csv", nrows = 10)

Όπως θα δείτε, υπάρχουν 85 στήλες για εξέταση. (Αν θέλετε να μάθετε τι σημαίνουν όλες οι στήλες, υπάρχουν αρχεία στη λήψη με το σχήμα δεδομένων και ένα PDF της αρχικής έρευνας.)

Για να διαβάσω όλα τα δεδομένα, θα χρησιμοποιήσω:

mydt <- fread ("data / survey_results_public.csv")

Στη συνέχεια, θα δημιουργήσω νέα δεδομένα. Πίνακας με λίγες στήλες για να διευκολύνεται η εργασία και η εμφάνιση αποτελεσμάτων. Μια υπενθύμιση ότι το data.table χρησιμοποιεί αυτήν τη βασική σύνταξη:

mydt [i, j, από]

Η εισαγωγή του πακέτου data.table λέει να το διαβάσει ως "λήψη dt, υποσύνολο ή αναδιάταξη σειρών χρησιμοποιώντας i, υπολογισμός j, ομαδοποιημένος κατά." Λάβετε υπόψη ότι τα i και j είναι παρόμοια με τη σειρά των αγκυλών βάσης R: πρώτη σειρά, δεύτερη στήλη. Επομένως, είμαι για λειτουργίες που θα κάνατε σε σειρές (επιλέγοντας σειρές με βάση αριθμούς σειράς ή συνθήκες). j είναι αυτό που θα κάνατε με στήλες (επιλέξτε στήλες ή δημιουργήστε νέες στήλες από υπολογισμούς). Ωστόσο, σημειώστε επίσης ότι μπορείτε να κάνετε πολύ περισσότερα μέσα σε αγκύλες δεδομένων. Από ένα βασικό πλαίσιο δεδομένων R. Και η ενότητα "από" είναι νέα στο data.table.

Επειδή είμαι επιλέγοντας στήλες, αυτός ο κώδικας πηγαίνει στο σημείο "j", που σημαίνει ότι οι αγκύλες χρειάζονται κόμμα πρώτα για να αφήσουν το σημείο "i" κενό:

mydt [, j]

Επιλέξτε στήλες data.table

Ένα από τα πράγματα που μου αρέσουν στο data.table είναι ότι είναι εύκολο να επιλέξετε στήλες είτε με αναφορά είτε χωρίς εισαγωγικά. Χωρίς αναφορά είναι συχνά πιο βολικό (αυτός είναι συνήθως ο τακτοποιημένος τρόπος). Αλλά αναφέρεται είναι χρήσιμο εάν χρησιμοποιείτε data.table μέσα στις δικές σας λειτουργίες ή εάν θέλετε να μεταφέρετε σε ένα διάνυσμα που δημιουργήσατε κάπου αλλού στον κώδικά σας.

Μπορείτε να επιλέξετε στήλες data.table με τον τυπικό βασικό τρόπο R, με ένα συμβατικό διάνυσμα με ονόματα στηλών που αναφέρονται. Για παράδειγμα:

dt1 <- mydt [, c ("LanguageWorkedWith", "LanguageDesireNextYear",

"OpenSourcer", "CurrencySymbol", "ConvertedComp",

"Χόμπιτς")]

Εάν θέλετε να τα χρησιμοποιήσετε Ηνωμένα Έθνηαναφέρεται, δημιουργήστε ένα λίστα αντί για διάνυσμα και μπορείτε να δώσετε τα μη εισαγωγικά ονόματα.

dt1 <- mydt [, list (LanguageWorkedWith, LanguageDesireNextYear,

OpenSourcer, CurrencySymbol, ConvertedComp,

Χόμπι)]

Και τώρα φτάνουμε στο πρώτο ειδικό σύμβολο μας. Αντί να πληκτρολογείτε λίστα(), μπορείτε απλά να χρησιμοποιήσετε μια τελεία:

dt1 <- mydt [,. (LanguageWorkedWith, LanguageDesireNextYear,

OpenSourcer, CurrencySymbol, ConvertedComp,

Χόμπι)]

Οτι .() είναι μια συντόμευση για λίστα() μέσα σε αγκύλες δεδομένων.

Τι γίνεται αν θέλετε να χρησιμοποιήσετε έναν ήδη υπάρχοντα φορέα με ονόματα στηλών; Η τοποθέτηση του ονόματος του διανυσματικού αντικειμένου μέσα σε δεδομένα. Οι αγκύλες των πινάκων δεν θα λειτουργήσουν. Αν δημιουργήσω ένα διάνυσμα με αναφερόμενα ονόματα στηλών, όπως:

mycols <- c ("LanguageWorkedWith", "LanguageDesireNextYear",

"OpenSourcer", "CurrencySymbol", "ConvertedComp", "Hobbyist")

Τότε αυτός ο κωδικός θαδεν εργασία:

dt1 <- mydt [, mycols]

Αντ 'αυτού, πρέπει να βάλετε .. (δηλαδή δύο τελείες) μπροστά από το όνομα του διανυσματικού αντικειμένου:

dt1 <- mydt [, ..mycols]

Γιατί δύο κουκκίδες; Αυτό μου φαινόταν τυχαίο μέχρι να διαβάσω την εξήγηση. Σκεφτείτε το σαν τις δύο κουκκίδες σε ένα τερματικό γραμμής εντολών Unix που σας ανεβάζουν έναν κατάλογο. Εδώ, ανεβαίνετε ένα χώρος ονομάτων, από το περιβάλλον μέσα σε αγκύλες data.table έως το παγκόσμιο περιβάλλον. (Αυτό πραγματικά με βοηθά να το θυμάμαι!)

Μετρήστε σειρές δεδομένων. Πίνακας

Στο επόμενο σύμβολο. Για να μετρήσετε ανά ομάδα, μπορείτε να χρησιμοποιήσετε το data.table's σύμβολο, όπου σημαίνει "αριθμός σειρών". Μπορεί να είναι ο συνολικός αριθμός σειρών ή αριθμός σειρών ανά ομάδα αν συγκεντρώνετε στην ενότητα "από".

Αυτή η έκφραση επιστρέφει τον συνολικό αριθμό σειρών στα δεδομένα. Πίνακας:

mydt [, .N]

Το ακόλουθο παράδειγμα υπολογίζει τον αριθμό των σειρών που ομαδοποιούνται κατά μία μεταβλητή: εάν τα άτομα στην έρευνα κωδικοποιούν επίσης ως χόμπι (το Χόμπι μεταβλητός).

mydt [, .N, Hobbyist]

# επιστροφές:

Χόμπι Ν 1: Ναι 71257 2: Όχι 17626

Μπορείτε να χρησιμοποιήσετε το απλό όνομα στήλης μέσα σε αγκύλες data.table εάν υπάρχει μόνο μία μεταβλητή. Εάν θέλετε να ομαδοποιήσετε με δύο ή περισσότερες μεταβλητές, χρησιμοποιήστε το . σύμβολο. Για παράδειγμα:

mydt [, .N,. (Χόμπι, OpenSourcer)]

Για να παραγγείλετε αποτελέσματα από το υψηλότερο στο χαμηλότερο, μπορείτε να προσθέσετε ένα δεύτερο σύνολο αγκυλών μετά το πρώτο. ο Το σύμβολο δημιουργεί αυτόματα μια στήλη με το όνομα Ν (φυσικά μπορείτε να την μετονομάσετε αν θέλετε), οπότε η παραγγελία με τον αριθμό των σειρών μπορεί να μοιάζει με αυτό:

mydt [, .N,. (Hobbyist, OpenSourcer)] [παραγγελία (Hobbyist, -N)]

Καθώς μαθαίνω τον κωδικό data.table, το βρίσκω χρήσιμο να το διαβάζω βήμα προς βήμα. Γι 'αυτό το διάβασα ως "Για όλα σειρές στο mydt (αφού δεν υπάρχει τίποτα στο σημείο "I"), μετρήστε τον αριθμό σειρών, ομαδοποίηση ανά Hobbyist και OpenSourcer. Στη συνέχεια, παραγγείλετε πρώτα από τον Χόμπιτ και μετά μειώστε τον αριθμό των σειρών. "

Αυτό ισοδυναμεί με αυτόν τον κωδικό dplyr:

mydf%>%

μέτρηση (Χόμπι, OpenSourcer)%>%

παραγγελία (Χόμπι, -n)

Εάν θεωρείτε πιο ευανάγνωστη την tidyverse συμβατική προσέγγιση πολλαπλών γραμμών, αυτός ο κωδικός data.table λειτουργεί επίσης:

mydt [, .N,

. (Χόμπι, OpenSourcer)] [

παραγγελία (Hobbyist, -N)

]

Προσθέστε στήλες σε έναν πίνακα δεδομένων

Στη συνέχεια, θα ήθελα να προσθέσω στήλες για να δω αν κάθε ερωτώμενος χρησιμοποιεί R, αν χρησιμοποιεί Python, αν χρησιμοποιεί και τα δύο ή αν δεν χρησιμοποιεί κανένα. ο LanguageWorkedWith Η στήλη περιέχει πληροφορίες σχετικά με τις χρησιμοποιούμενες γλώσσες και μερικές σειρές αυτών των δεδομένων μοιάζουν με αυτήν:

Sharon Machlis

Κάθε απάντηση είναι μια συμβολοσειρά ενός χαρακτήρα. Οι περισσότερες έχουν πολλές γλώσσες χωρισμένες με ερωτηματικό.

Όπως συμβαίνει συχνά, είναι πιο εύκολο να αναζητήσετε Python από το R, καθώς δεν μπορείτε απλώς να αναζητήσετε το "R" στη συμβολοσειρά (το Ruby και το Rust περιέχουν επίσης ένα κεφαλαίο R) με τον τρόπο που μπορείτε να αναζητήσετε το "Python". Αυτός είναι ο απλούστερος κώδικας για τη δημιουργία ενός TRUE / FALSE φορέα που ελέγχει εάν κάθε συμβολοσειρά μέσα LanguageWorkedWith περιέχει Python:

ifelse (LanguageWorkedWith% like% "Python", TRUE, FALSE)

Εάν γνωρίζετε τη SQL, θα αναγνωρίσετε αυτήν τη σύνταξη "like". Εγώ, λοιπόν %σαν%. Είναι ένας καλός εξορθολογισμένος τρόπος για να ελέγξετε για αντιστοίχιση μοτίβων Η τεκμηρίωση της συνάρτησης αναφέρει ότι προορίζεται να χρησιμοποιηθεί μέσα σε αγκύλες δεδομένων. Πίνακας, αλλά στην πραγματικότητα μπορείτε να τη χρησιμοποιήσετε σε οποιονδήποτε από τους κωδικούς σας, όχι μόνο με τους πίνακες δεδομένων. Έλεγξα με τον δημιουργό του data.table Matt Dowle, ο οποίος είπε ότι η συμβουλή να το χρησιμοποιήσετε μέσα στα αγκύλη είναι επειδή υπάρχει κάποια επιπλέον βελτιστοποίηση απόδοσης.

Στη συνέχεια, ακολουθεί ο κώδικας για να προσθέσετε μια στήλη που ονομάζεται PythonUser στα data.table:

dt1 [, PythonUser: = ifelse (LanguageWorkedWith% like% "Python", TRUE, FALSE)]

Παρατηρήστε το := χειριστής. Ο Python έχει και έναν χειριστή, και από τότε που το άκουσα να ονομάζεται «χειριστής Walrus», αυτό το λέω. Νομίζω ότι είναι επίσημα «ανάθεση με αναφορά». Αυτό συμβαίνει επειδή ο παραπάνω κώδικας άλλαξε το υπάρχον αντικείμενο dt1 data.table προσθέτοντας τη νέα στήλη - χωρίς πρέπει να το αποθηκεύσετε σε μια νέα μεταβλητή.

Για να αναζητήσω το R, θα χρησιμοποιήσω την τυπική έκφραση "\ bR \ b" που λέει: "Βρείτε ένα μοτίβο που ξεκινά με ένα όριο λέξεων - το \σι, τότε ένα Ρκαι στη συνέχεια τελειώστε με ένα άλλο όριο λέξεων. (Δεν μπορώ απλώς να αναζητήσω το "R;" επειδή το τελευταίο στοιχείο σε κάθε συμβολοσειρά δεν έχει ερωτηματικό.)

Αυτό προσθέτει μια στήλη RUser στο dt1:

dt1 [, RUser: = ifelse (LanguageWorkedWith% like% "\ bR \ b", TRUE, FALSE)]

Εάν θέλετε να προσθέσετε και τις δύο στήλες ταυτόχρονα με := θα χρειαστεί να μετατρέψετε αυτόν τον χειριστή θαλάμου σε μια συνάρτηση, ορίζοντας το ως εξής:

dt1 [, `:=`(

PythonUser = ifelse (LanguageWorkedWith% like% "Python", TRUE, FALSE),

RUser = ifelse (LanguageWorkedWith% like% "\ bR \ b", TRUE, FALSE)

)]

Πιο χρήσιμοι χειριστές δεδομένων

Υπάρχουν πολλοί άλλοι τελεστές δεδομένων. Αξίζει να γνωρίζετε. ο%μεταξύ% ο χειριστής έχει αυτήν τη σύνταξη:

myvector% μεταξύ% c (χαμηλότερη τιμή, ανώτερη τιμή)

Επομένως, αν θέλω να φιλτράρω για όλες τις απαντήσεις, όπου η αποζημίωση ήταν μεταξύ 50.000 και 100.000 σε δολάρια ΗΠΑ, αυτός ο κωδικός λειτουργεί:

comp_50_100k <- dt1 [CurrencySymbol == "USD" &

ΜετατροπήComp% μεταξύ% c (50000, 100000)]

Η δεύτερη γραμμή παραπάνω είναι η κατάσταση μεταξύ. Σημειώστε ότι το %μεταξύ% Ο χειριστής περιλαμβάνει τόσο τις χαμηλότερες όσο και τις ανώτερες τιμές όταν ελέγχει.

Ένας άλλος χρήσιμος χειριστής είναι %πηγούνι%. Λειτουργεί σαν βάση R's %σε% αλλά έχει βελτιστοποιηθεί για ταχύτητα και είναι για διανύσματα χαρακτήρων μόνο. Έτσι, εάν θέλω να φιλτράρω για όλες τις σειρές όπου η στήλη OpenSourcer ήταν είτε "Ποτέ" είτε "Λιγότερο από μία φορά το χρόνο", αυτός ο κώδικας λειτουργεί:

rareos <- dt1 [OpenSourcer% chin% c ("Ποτέ", "Λιγότερο από μία φορά το χρόνο")]

Αυτό μοιάζει πολύ με τη βάση R, εκτός από το ότι η βάση R πρέπει να καθορίσει το όνομα του πλαισίου δεδομένων μέσα στο βραχίονα και απαιτεί επίσης κόμμα μετά την έκφραση του φίλτρου:

rareos_df <- df1 [df1 $ OpenSourcer% σε% c ("Ποτέ", "Λιγότερο από μία φορά το χρόνο"),]

Η νέα συνάρτηση fcase ()

Για αυτήν την τελική επίδειξη, θα ξεκινήσω δημιουργώντας νέα δεδομένα. Τραπέζι με μόνο άτομα που ανέφεραν αποζημίωση σε δολάρια ΗΠΑ:

usd <- dt1 [CurrencySymbol == "USD" &! is.na (ConvertedComp)]

Στη συνέχεια, θα δημιουργήσω μια νέα στήλη με την ονομασία Γλώσσα για το αν κάποιος χρησιμοποιεί μόνο R, μόνο Python, και τα δύο ή και τα δύο. Και θα χρησιμοποιήσω το νέο βλάστηση () λειτουργία. Τη στιγμή που δημοσιεύτηκε αυτό το άρθρο, βλάστηση () ήταν διαθέσιμο μόνο στην έκδοση ανάπτυξης του data.table. Εάν έχετε ήδη εγκατεστημένο το data.table, μπορείτε να ενημερώσετε την τελευταία έκδοση dev με αυτήν την εντολή:

data.table :: update.dev.pkg ()

Η συνάρτηση fcase () είναι παρόμοια με την SQL ΠΕΡΙΠΤΩΣΗ ΠΟΤΕ δήλωση και dplyr's case_when () λειτουργία. Η βασική σύνταξη είναιfcase (συνθήκη1, "τιμή1", συνθήκη2, "τιμή2") και ούτω καθεξής. Μια προεπιλεγμένη τιμή για "οτιδήποτε άλλο" μπορεί να προστεθεί με προεπιλογή = τιμή.

Εδώ είναι ο κώδικας για τη δημιουργία της νέας στήλης Γλώσσα:

usd [, Γλώσσα: = fcase (

RUser &! PythonUser, "R",

PythonUser &! RUser, "Python",

PythonUser & RUser, "Και τα δύο",

! PythonUser &! RUser, "Neither"

)]

Βάζω κάθε συνθήκη σε μια ξεχωριστή γραμμή, διότι το βρίσκω ευκολότερο να το διαβάσω, αλλά δεν χρειάζεται.

Προσοχή: Εάν χρησιμοποιείτε το RStudio, η δομή του data.table δεν ενημερώνεται αυτόματα στο επάνω δεξιό τμήμα του παραθύρου RStudio μετά τη δημιουργία μιας νέας στήλης με τον χειριστή του walrus. Πρέπει να κάνετε χειροκίνητο κλικ στο εικονίδιο ανανέωσης για να δείτε αλλαγές στον αριθμό των στηλών.

Υπάρχουν μερικά άλλα σύμβολα που δεν θα καλύψω σε αυτό το άρθρο. Μπορείτε να βρείτε μια λίστα με αυτά στο αρχείο δεδομένων "ειδικών συμβόλων" βοήθεια ("ειδικά σύμβολα"). Ένα από τα πιο χρήσιμα, το .SD, έχει ήδη το δικό του άρθρο και βίντεο Do More With R, "Πώς να χρησιμοποιήσετε το .SD στο πακέτο R data.table."

Για περισσότερες συμβουλές R, μεταβείτε στη σελίδα "Do More With R" ή δείτε τη λίστα αναπαραγωγής YouTube "Do More With R".