R Data Frame: Τρόπος δημιουργίας, προσθήκης, επιλογής και υποομάδας

⚡ Έξυπνη Σύνοψη

Το R Data Frame αποθηκεύει στήλες διαφορετικών τύπων σε ίσο μήκος, γεγονός που το καθιστά την τυπική ορθογώνια δομή για ανάλυση. Οι αγκύλες κόβουν γραμμές και στήλες, το σύμβολο του δολαρίου φτάνει σε μια στήλη και το subset() φιλτράρει κατά συνθήκη.

  • 🧱 Δομή: Ένα πλαίσιο δεδομένων είναι μια λίστα διανυσμάτων ίσου μήκους, επομένως κάθε στήλη μπορεί να έχει διαφορετικό τύπο.
  • Δημιουργία: Η συνάρτηση data.frame(a, b, c, d) ενώνει τέσσερα διανύσματα και η συνάρτηση names() μετονομάζει κάθε στήλη στη συνέχεια.
  • Τεμαχισμός: Η συνάρτηση df[A, B] διαβάζεται ως γραμμές και στη συνέχεια ως στήλες, και μια κενή πλευρά επιλέγει όλα όσα βρίσκονται σε αυτήν την πλευρά.
  • Προσθήκη: Η συνάρτηση df$quantity αντιστοιχίζει μια νέα στήλη, υπό την προϋπόθεση ότι το νέο διάνυσμα ταιριάζει ακριβώς με τον αριθμό των γραμμών.
  • 🔎 Φιλτράρισμα: Η subset(df, subset = price > 5) διατηρεί μόνο τις γραμμές όπου η συνθήκη αξιολογείται ως TRUE.
  • ⚠️ Έκδοση Shift: Από την έκδοση R 4.0.0, η προεπιλεγμένη τιμή stringsAsFactors είναι FALSE, επομένως οι στήλες κειμένου παραμένουν χαρακτήρες.

Πλαίσιο δεδομένων R Δημιουργία Προσάρτηση Επιλογή και Υποσύνολο

Τι είναι ένα πλαίσιο δεδομένων;

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

Αυτός ο ορισμός τοποθετεί το πλαίσιο δεδομένων μεταξύ δύο γειτόνων που θα συναντάτε συνεχώς στο R. A. μήτρα είναι ορθογώνιο αλλά μονοτυπικό, και ένα λίστα είναι πολλαπλού τύπου αλλά ακανόνιστο. Το πλαίσιο δεδομένων δανείζεται μία ιδιότητα από το καθένα.

Structure Τύποι στηλών Μήκη στοιχείων Τυπική χρήση
διάνυσμα Μόνο ένας τύπος Μία ακολουθία Μία μεταβλητή
Μήτρα Μόνο ένας τύπος Ορθογώνιος Αριθμητική άλγεβρα
Λιστα Οποιοδήποτε μείγμα τύπων Μπορεί να διαφέρει ανά στοιχείο Αυθαίρετες εισπράξεις
Πλαίσιο δεδομένων Οποιοδήποτε μείγμα τύπων Κάθε στήλη έχει ίσο μήκος Πινακική ανάλυση

Επειδή ένα πλαίσιο δεδομένων είναι στην πραγματικότητα μια λίστα από κάτω, τα accessors που χρησιμοποιούνται στις λίστες λειτουργούν και εδώ, γι' αυτό και το σύμβολο του δολαρίου εμφανίζεται ξανά αργότερα σε αυτό το σεμινάριο.

Πώς να δημιουργήσετε ένα πλαίσιο δεδομένων

Μπορούμε να δημιουργήσουμε ένα πλαίσιο δεδομένων στο R περνώντας τις μεταβλητές a, b, c και d στη συνάρτηση data.frame(). Μπορούμε να δημιουργήσουμε το πλαίσιο δεδομένων και να ονομάσουμε τις στήλες με names(), απλώς καθορίζοντας το όνομα κάθε μεταβλητής.

data.frame(df, stringsAsFactors = TRUE)

Επιχειρήματα:

  • df: Μπορεί να είναι ένας πίνακας για μετατροπή ως πλαίσιο δεδομένων ή μια συλλογή μεταβλητών προς ένταξη
  • stringsAsFactors: Ελέγχει εάν τα διανύσματα χαρακτήρων γίνονται στήλες παραγόντων. Η εργοστασιακή προεπιλογή ήταν TRUE σε παλαιότερες εκδόσεις και έχει οριστεί σε FALSE από την R 4.0.0, επομένως διαβιβάζεται ρητά όταν η συμπεριφορά έχει σημασία.

Μπορούμε να δημιουργήσουμε ένα πλαίσιο δεδομένων στο R για το πρώτο μας σύνολο δεδομένων συνδυάζοντας τέσσερις μεταβλητές ίδιου μήκους.

# Create a, b, c, d variables
a <- c(10,20,30,40)
b <- c('book', 'pen', 'textbook', 'pencil_case')
c <- c(TRUE,FALSE,TRUE,FALSE)
d <- c(2.5, 8, 10, 7)
# Join the variables to create a data frame
df <- data.frame(a,b,c,d)
df

Παραγωγή:

##     a         b     c     d
## 1  10        book  TRUE   2.5
## 2  20         pen  FALSE  8.0
## 3  30    textbook  TRUE   10.0
## 4  40 pencil_case  FALSE  7.0

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

Μπορούμε να δούμε ότι οι κεφαλίδες στηλών έχουν το ίδιο όνομα με τις μεταβλητές. Μπορούμε να αλλάξουμε το όνομα της στήλης στο R με τα ονόματα συναρτήσεων(). Ελέγξτε το παράδειγμα R δημιουργία πλαισίου δεδομένων παρακάτω:

# Name the data frame
names(df) <- c('ID', 'items', 'store', 'price')
df

Παραγωγή:

##   ID       items store price
## 1 10        book  TRUE   2.5
## 2 20         pen FALSE   8.0
## 3 30    textbook  TRUE  10.0
## 4 40 pencil_case FALSE   7.0

Η ανάθεση σε names() αντικαθιστά κάθε κεφαλίδα ταυτόχρονα, επομένως το διάνυσμα αντικατάστασης πρέπει να έχει ακριβώς μία καταχώρηση ανά στήλη. Για να μετονομάσετε μια μόνο στήλη, δημιουργήστε ευρετήριο στο διάνυσμα names, όπως στο names(df)[2] <- 'product'.

# Print the structure
str(df)

Παραγωγή:

## 'data.frame':    4 obs. of  4 variables:
##  $ ID   : num  10 20 30 40
##  $ items: Factor w/ 4 levels "book","pen","pencil_case",..: 1 2 4 3
##  $ store: logi  TRUE FALSE TRUE FALSE
##  $ price: num  2.5 8 10 7

Σημείωση έκδοσης. Η παραπάνω έξοδος δημιουργήθηκε σε μια έκδοση R παλαιότερη από την έκδοση 4.0.0, όπου η data.frame() μετέτρεπε τα διανύσματα χαρακτήρων σε παράγοντες από προεπιλογή, γι' αυτό και τα στοιχεία αναφέρονται ως Παράγοντας με τέσσερα επίπεδα. Η βασική τεκμηρίωση της R καταγράφει ότι αυτή η εργοστασιακά νέα προεπιλογή άλλαξε σε stringsAsFactors = FALSE για R 4.0.0Η εκτέλεση του ίδιου κώδικα σε μια τρέχουσα έκδοση αφήνει τα στοιχεία ως στήλη απλών χαρακτήρων και η str() εκτυπώνει chr αντί αυτού. Προσθέστε stringsAsFactors = TRUE στην κλήση data.frame() για να αναπαράγετε την εκτυπωμένη έξοδο ή να διαβάσετε το φροντιστήριο παράγοντα για όταν οι παράγοντες είναι πραγματικά επιθυμητοί.

Slice Data Frame

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

Είναι δυνατό να κάνουμε τεμαχισμό τιμών ενός Πλαισίου Δεδομένων (Data Frame). Επιλέγουμε τις γραμμές και τις στήλες που θα επιστραφούν μέσα σε αγκύλες που προηγούνται από το όνομα του πλαισίου δεδομένων.

Ένα πλαίσιο δεδομένων αποτελείται από γραμμές και στήλες, df[A, B]. Το Α αντιπροσωπεύει τις γραμμές και το Β τις στήλες. Μπορούμε να κάνουμε φέτες είτε καθορίζοντας τις γραμμές και/ή τις στήλες.

Από την εικόνα 1 παρακάτω, το αριστερό μέρος αντιπροσωπεύει το σειρές, και το δεξί μέρος είναι το στήλες. Σημειώστε ότι το σύμβολο : σημαίνει προς την. Για παράδειγμα, το 1:3 σκοπεύει να επιλέξει τιμές από το 1 προς την 3.

Σύνταξη τεμαχισμού πλαισίου δεδομένων R df[A, B] με γραμμές αριστερά από το κόμμα και στήλες δεξιά

Στο παρακάτω διάγραμμα παρουσιάζουμε τον τρόπο πρόσβασης σε διαφορετικές επιλογές του πλαισίου δεδομένων:

Χρωματιστά βέλη πάνω από ένα πλαίσιο δεδομένων R που δείχνουν επιλογές μεμονωμένου κελιού, εύρους γραμμών, ολόκληρης στήλης και μπλοκ

  • Το κίτρινο βέλος επιλέγει το σειρά 1 σε στήλη 2
  • Το πράσινο βέλος επιλέγει το σειρές από 1 έως 2
  • Το κόκκινο βέλος επιλέγει το στήλη 1
  • Το μπλε βέλος επιλέγει το σειρές 1 έως 3 και στήλες από 3 έως 4

Σημειώστε ότι, αν αφήσουμε το αριστερό μέρος κενό, το R θα επιλέξει όλες οι σειρές. Κατ' αναλογία, αν αφήσουμε το δεξί μέρος κενό, το R θα επιλέξει όλες οι στήλες.

Μπορούμε να εκτελέσουμε τον κώδικα στην κονσόλα:

## Select row 1 in column 2
df[1,2]

Παραγωγή:

## [1] book
## Levels: book pen pencil_case textbook

Η γραμμή Επίπεδα εμφανίζεται επειδή τα στοιχεία είναι ένας παράγοντας σε αυτήν την συνεδρία. Στην έκδοση R 4.0.0 και νεότερες εκδόσεις, η ίδια κλήση εκτυπώνει τη μοναδική συμβολοσειρά «βιβλίο» χωρίς γραμμή Επίπεδα.

## Select Rows 1 to 2
df[1:2,]

Παραγωγή:

##   ID items store price
## 1 10  book  TRUE   2.5
## 2 20   pen FALSE   8.0
## Select Columns 1
df[,1]

Παραγωγή:

## [1] 10 20 30 40

Η επιλογή μίας μόνο στήλης με df[,1] αποσύρει το περιτύλιγμα πλαισίου και επιστρέφει ένα απλό διάνυσμα. Προσθέστε drop = FALSE, όπως στο df[, 1, drop = FALSE], όταν χρειάζεται ένα πλαίσιο δεδομένων μίας στήλης.

## Select Rows 1 to 3 and columns 3 to 4
df[1:3, 3:4]

Παραγωγή:

##   store price
## 1  TRUE   2.5
## 2 FALSE   8.0
## 3  TRUE  10.0

Είναι επίσης δυνατό να επιλέξετε τις στήλες με τα ονόματά τους. Για παράδειγμα, ο παρακάτω κώδικας π.χ.tracts δύο στήλες: ID και store.

# Slice with columns name
df[, c('ID', 'store')]

Παραγωγή:

##   ID store
## 1 10  TRUE
## 2 20 FALSE
## 3 30  TRUE
## 4 40 FALSE

Τα ονόματα είναι ασφαλέστερα από τις θέσεις στον κώδικα παραγωγής, επειδή η εισαγωγή ή η αναδιάταξη μιας στήλης αλλάζει σιωπηλά αυτό στο οποίο αναφέρεται η συνάρτηση df[, 3], ενώ η συνάρτηση df[, 'store'] συνεχίζει να δείχνει στα ίδια δεδομένα.

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

Μπορείτε επίσης να προσθέσετε μια στήλη σε ένα Data Frame. Πρέπει να χρησιμοποιήσετε το σύμβολο $ για να ονομάσετε τη νέα μεταβλητή και να προσθέσετε μια στήλη σε ένα dataframe στην R.

# Create a new vector
quantity <- c(10, 35, 40, 5)

# Add `quantity` to the `df` data frame
df$quantity <- quantity
df

Παραγωγή:

##   ID       items store price quantity
## 1 10        book  TRUE   2.5       10
## 2 20         pen FALSE   8.0       35
## 3 30    textbook  TRUE  10.0       40
## 4 40 pencil_case FALSE   7.0        5

Σημείωση: Ο αριθμός των στοιχείων στο διάνυσμα πρέπει να είναι ίσος με τον αριθμό των στοιχείων στο πλαίσιο δεδομένων. Εκτελώντας την ακόλουθη εντολή για να προσθέσετε μια στήλη στο πλαίσιο δεδομένων στην R

quantity <- c(10, 35, 40)
# Add `quantity` to the `df` data frame
df$quantity <- quantity

Δίνει σφάλμα:

Error in `

lt;-.data.frame`(`*tmp*`, quantity, value = c(10, 35, 40))
replacement has 3 rows, data has 4

Το μήνυμα ονομάζει τον τελεστή αντικατάστασης για τα πλαίσια δεδομένων και δηλώνει και τους δύο αριθμούς, επομένως σας λέει ακριβώς τι πρέπει να διορθώσετε. Η R ανακυκλώνει μια αντικατάσταση μόνο όταν το μήκος της διαιρεί τον αριθμό των γραμμών ομοιόμορφα, γι' αυτό και μια τιμή μήκους-1, όπως df$currency <- 'EUR', γίνεται δεκτή, ενώ ένα διάνυσμα μήκους-3 έναντι τεσσάρων γραμμών απορρίπτεται. Η cbind() προσθέτει μια στήλη με τον ίδιο τρόπο και η rbind() είναι η αντίστοιχη για την προσθήκη γραμμών.

Επιλέξτε μια στήλη ενός πλαισίου δεδομένων

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

# Select the column ID
df$ID

Παραγωγή:

## [1] 1 2 3 4

Διαβάστε προσεκτικά αυτήν την έξοδο. Το ID δημιουργήθηκε από το διάνυσμα c(10, 20, 30, 40), επομένως μια κονσόλα ζωντανής εκτέλεσης εκτυπώνει 10 20 30 40 εδώ. Τα 1 2 3 4 που φαίνονται παραπάνω είναι θέσεις γραμμών και όχι οι αποθηκευμένες τιμές. Το [1] στην αρχή της γραμμής είναι απλώς ο δείκτης του πρώτου στοιχείου σε αυτήν τη γραμμή, όχι μέρος των δεδομένων.

Τρεις διαδρομές φτάνουν στην ίδια στήλη: df$ID, df[['ID']] και df[, 'ID']. Το σύμβολο του δολαρίου εκτελεί μερική αντιστοίχιση, επομένως το df$I θα εξακολουθεί να βρίσκει το ID, κάτι που είναι βολικό στην κονσόλα και επικίνδυνο σε ένα αποθηκευμένο σενάριο.

Υποορίστε ένα πλαίσιο δεδομένων

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

Χρησιμοποιούμε τη συνάρτηση subset().

subset(x, condition)
arguments:
- x: data frame used to perform the subset
- condition: define the conditional statement

Θέλουμε να επιστρέψουμε μόνο τα προϊόντα με τιμή άνω του 5, επομένως μπορούμε να κάνουμε τα εξής:

# Select price above 5
subset(df, subset = price > 5)

Παραγωγή:

ID       items store price
2 20         pen FALSE     8
3 30    textbook  TRUE    10
4 40 pencil_case FALSE     7

Οι ετικέτες γραμμών 2, 3 και 4 είναι τα αρχικά ονόματα γραμμών που μεταφέρθηκαν από το df, και έτσι μπορείτε να καταλάβετε ότι η πρώτη γραμμή φιλτραρίστηκε. Η subset() δέχεται επίσης ένα όρισμα επιλογής για την επιλογή στηλών ταυτόχρονα και η ισοδύναμη μορφή αγκύλης είναι df[df$price > 5, ]. Η μορφή αγκύλης διατηρεί τις γραμμές NA όπου η συνθήκη λείπει, ενώ η subset() τις απορρίπτει, επομένως οι δύο δεν είναι πάντα εναλλάξιμες.

Συχνές Ερωτήσεις

Χρησιμοποιήστε τη συνάρτηση rbind(df, new_row), όπου new_row είναι ένα πλαίσιο δεδομένων ή μια λίστα με τις ίδιες στήλες στην ίδια σειρά. Οι τύποι στηλών πρέπει να ταιριάζουν, διαφορετικά η R τους εξαναγκάζει. Για πολλές γραμμές, δημιουργήστε πρώτα μια λίστα και συνδυάστε την μία φορά, επειδή οι επαναλαμβανόμενες κλήσεις της συνάρτησης rbind() είναι αργές.

Αντιστοιχίστε την τιμή NULL σε αυτήν, όπως στο df$quantity <- NULL. Η αρνητική ευρετηρίαση λειτουργεί επίσης: η df[, -3] αφαιρεί την τρίτη στήλη και η df[, !names(df) %in% c("store")] αφαιρεί στήλες κατά όνομα χωρίς να εξαρτάται από τη θέση τους.

Η dim(df) επιστρέφει γραμμές και στήλες μαζί, ενώ η nrow() και η ncol() επιστρέφουν την καθεμία ξεχωριστά. Η str(df) εκτυπώνει τον τύπο κάθε στήλης, η summary(df) δίνει στατιστικά στοιχεία ανά στήλη και η head(df) εμφανίζει τις πρώτες έξι γραμμές.

Ευρετηριάστε το διάνυσμα ονομάτων: names(df)[2] <- "product" αλλάζει μόνο τη δεύτερη κεφαλίδα. Για να μετονομάσετε με το τρέχον όνομα, χρησιμοποιήστε names(df)[names(df) == "items"] <- "product", το οποίο συνεχίζει να λειτουργεί ακόμα και μετά την αλλαγή της σειράς των στηλών.

Ένα tibble είναι το πλαίσιο δεδομένων tidyverse. Δεν μετατρέπει ποτέ συμβολοσειρές σε παράγοντες, δεν αντιστοιχίζει ποτέ μερικώς τα ονόματα των στηλών, εκτυπώνει μόνο τις πρώτες δέκα γραμμές με τύπους στηλών και επιστρέφει πάντα ένα tibble όταν υποσυντίθεται με μία μόνο αγκύλη.

Το φίλτρο(df, τιμή > 5) είναι το dplyr ισοδύναμο, και συνδέεται αλυσιδωτά με τις select(), mutate() και arrange() μέσω του σωλήνα. Σε αντίθεση με την subset(), η filter() έχει σχεδιαστεί για προγραμματιστική χρήση, επομένως συμπεριφέρεται προβλέψιμα μέσα σε συναρτήσεις.

Οι βοηθοί τεχνητής νοημοσύνης διαβάζουν την έξοδο των str() και summary() και, στη συνέχεια, προτείνουν μετατροπές τύπων, στρατηγικές ελλείπουσας τιμής και μετονομασίες στηλών ως εκτελέσιμο κώδικα. Εξηγούν επίσης κρυπτικά σφάλματα αντικατάστασης, αν και κάθε παραγόμενος μετασχηματισμός χρειάζεται έλεγχο σε σχέση με τα πραγματικά δεδομένα.

Ναί. GitHub Copilot τρέχει μέσα Rstudio 2023.09.0 και νεότερες εκδόσεις μέσω των Εργαλείων, των Καθολικών Επιλογών και, στη συνέχεια, της ρύθμισης βοηθού κώδικα. Σχεδιάζει κλήσεις data.frame(), subset() και rbind() από ένα σχόλιο, αλλά τα ονόματα των στηλών πρέπει να επαληθευτούν.

Συνοψίστε αυτήν την ανάρτηση με: