Συνάρτηση Matrix στο R: Δημιουργία, εκτύπωση, προσθήκη στήλης και τομής
⚡ Έξυπνη Σύνοψη
Ένας πίνακας στην R είναι ένας δισδιάστατος πίνακας που περιέχει έναν μόνο τύπο δεδομένων σε m γραμμές και n στήλες, που κατασκευάζεται με matrix(), επεκτείνεται με cbind() και rbind() και προσεγγίζεται μέσω αγκυλών.
Συνάρτηση Matrix στο R
Μια συνάρτηση μήτρας στο R είναι ένας δισδιάστατος πίνακας που έχει m αριθμό σειρών και n αριθμό στηλών. Με άλλα λόγια, ο πίνακας στον προγραμματισμό R είναι ένας συνδυασμός δύο ή περισσότερων διανυσμάτων με τον ίδιο τύπο δεδομένων.
Παρακάτω, ένας πίνακας είναι απλώς ένα διάνυσμα που φέρει ένα χαρακτηριστικό dim μήκους δύο. Αυτός είναι ο λόγος για τον οποίο κάθε στοιχείο πρέπει να μοιράζεται έναν τύπο: τη στιγμή που μια τιμή χαρακτήρα ενώνει αριθμούς, ολόκληρος ο πίνακας μετατρέπεται σε χαρακτήρα. Η R αποθηκεύει τις τιμές σε μία μόνο εκτέλεση ανά στήλη και χρησιμοποιεί το dim για να αποφασίσει πού τελειώνει κάθε γραμμή, επομένως η επιλογή του Τύπος δεδομένων ισχύει για ολόκληρο το αντικείμενο ταυτόχρονα.
Σημείωση: Η ίδια η matrix() επιστρέφει πάντα ακριβώς δύο διαστάσεις. Για να δημιουργήσετε μια δομή με τρεις ή περισσότερες διαστάσεις στην R, χρησιμοποιήστε τον πίνακα() με ένα διάνυσμα dim ή αντιστοιχίστε απευθείας την dim(). Το παρακάτω διάγραμμα δείχνει τη διάταξη γραμμών και στηλών που ακολουθεί κάθε πίνακας.
Πώς να δημιουργήσετε ένα Matrix στο R
Μπορούμε να δημιουργήσουμε έναν πίνακα με τη συνάρτηση μήτρα()Η βασική υπογραφή R δέχεται πέντε ορίσματα και τα τρία που χρησιμοποιούνται συχνότερα εμφανίζονται εδώ:
matrix(data, nrow, ncol, byrow = FALSE)
επιχειρήματα:
- ημερομηνία: Η συλλογή στοιχείων που η R θα ταξινομήσει στις γραμμές και τις στήλες του πίνακα.
- nrow: Αριθμός γραμμών.
- ncol: Αριθμός στηλών.
- παρακάτω: Μια λογική σημαία. Με την προεπιλεγμένη τιμή byrow = FALSE, ο πίνακας συμπληρώνεται στήλη προς στήλη, από πάνω προς τα κάτω. Με byrow = TRUE, συμπληρώνεται γραμμή προς γραμμή, από αριστερά προς τα δεξιά.
- dimnames: Μια προαιρετική λίστα μήκους δύο που παρέχει τα ονόματα γραμμών και τα ονόματα στηλών.
Δύο λεπτομέρειες από την βασική αναφορά R αξίζει να γνωρίζουμε πριν από το πρώτο παράδειγμα. Εάν δίνεται μόνο μία από τις μεταβλητές nrow και ncol, η R συμπεραίνει την άλλη από το μήκος των δεδομένων. Και εάν τα δεδομένα περιέχουν πολύ λίγα στοιχεία για να συμπληρώσουν το σχήμα που ζητήσατε, οι τιμές ανακυκλώνονται αντί να απορρίπτονται.
Ας κατασκευάσουμε δύο πίνακες 5×2 από την ακολουθία αριθμών από το 1 έως το 10, έναν με byrow = TRUE και έναν με byrow = FALSE, για να δούμε τη διαφορά.
# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow = TRUE matrix_a <-matrix(1:10, byrow = TRUE, nrow = 5) matrix_a
Παραγωγή:
Επειδή χρησιμοποιήθηκε η τιμή byrow = TRUE, η κονσόλα γεμίζει την πρώτη γραμμή με 1 και 2, τη δεύτερη γραμμή με 3 και 4, και ούτω καθεξής.
Εκτυπώστε τη διάσταση του matrix_a με dim()
Τώρα, ας εκτυπώσουμε τη διάσταση του πίνακα σε R με dim(). Η σύνταξη για την εκτύπωση του πίνακα στο R χρησιμοποιώντας dim() είναι:
# Print dimension of the matrix with dim()
dim(matrix_a)
Παραγωγή:
## [1] 5 2
Η συνάρτηση dim() επιστρέφει πρώτα τον αριθμό των γραμμών και στη συνέχεια τον αριθμό των στηλών, επιβεβαιώνοντας το σχήμα 5×2.
Συμπλήρωση ενός πίνακα ανά στήλη με byrow = FALSE
Οι ίδιοι δέκα αριθμοί και η ίδια σειρά παράγουν διαφορετική διάταξη μόλις αλλάξει η κατεύθυνση πλήρωσης. Κρατήστεping Η byrow στην προεπιλογή της στέλνει τις τιμές προς τα κάτω στην πρώτη στήλη πριν ξεκινήσει η δεύτερη.
# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow = FALSE matrix_b <-matrix(1:10, byrow = FALSE, nrow = 5) matrix_b
Παραγωγή:
Εκτυπώστε τη διάσταση του matrix_b με dim()
Και πάλι, εκτυπώστε τη διάσταση του πίνακα χρησιμοποιώντας dim(). Ακολουθεί μια σύνταξη της διάστασης του πίνακα εκτύπωσης R:
# Print dimension of the matrix with dim()
dim(matrix_b)
Παραγωγή:
## [1] 5 2
Το σχήμα παραμένει αμετάβλητο στο 5×2, επειδή η σειρά πλήρωσης αλλάζει τη σειρά γεμίσματος και ποτέ τις διαστάσεις.
ΣημείωσηΗ χρήση της εντολής matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) θα έχει το ίδιο αποτέλεσμα όπως παραπάνω, αφού η R συμπεραίνει nrow = 5 από τις δέκα τιμές που παρέχονται.
Μπορείτε επίσης να δημιουργήσετε έναν πίνακα 4×3 χρησιμοποιώντας το ncol. Η R θα δημιουργήσει 3 στήλες και θα γεμίσει κάθε στήλη από πάνω προς τα κάτω. Δείτε ένα παράδειγμα.
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c
Παραγωγή:
## [,1] [,2] [,3] ## [1,] 1 5 9 ## [2,] 2 6 10 ## [3,] 3 7 11 ## [4,] 4 8 12
Οι κεφαλίδες στηλών [,1] έως [,3] και οι ετικέτες γραμμών [1,] έως [4,] είναι τα προεπιλεγμένα placeholders της R. Εξαφανίζονται μόλις δοθούν πραγματικά dimnames, όπως φαίνεται αργότερα σε αυτό το σεμινάριο.
Παράδειγμα:
dim(matrix_c)
Παραγωγή:
## [1] 4 3
Προσθέστε μια στήλη σε έναν πίνακα με την cbind()
Μπορείτε να προσθέσετε στήλες στον πίνακα R με την εντολή cbind(). Η cbind() σημαίνει σύνδεση στηλών και μπορεί να συνενώσει όσες μήτρες ή στήλες καθορίζονται. Για παράδειγμα, το προηγούμενο παράδειγμά μας δημιούργησε έναν πίνακα 5×2. Συνενώνουμε μια τρίτη στήλη και επαληθεύουμε ότι η διάσταση είναι 5×3.
Παράδειγμα:
# concatenate c(1:5) to the matrix_a matrix_a1 <- cbind(matrix_a, c(1:5)) # Check the dimension dim(matrix_a1)
Παραγωγή:
## [1] 5 3
Παράδειγμα:
matrix_a1
Παραγωγή
## [,1] [,2] [,3] ## [1,] 1 2 1 ## [2,] 3 4 2 ## [3,] 5 6 3 ## [4,] 7 8 4 ## [5,] 9 10 5
Παράδειγμα:
Μπορούμε επίσης να συνδέσουμε περισσότερες από μία στήλες ταυτόχρονα. Το επόμενο μπλοκ δημιουργεί τον πίνακα_a2, έναν πίνακα 4×3 που περιέχει τους αριθμούς από 13 έως 24, έτσι ώστε να μπορεί να ενωθεί με τον πίνακα_c 4×3 για να παράγει ένα αποτέλεσμα 4×6 που καλύπτει το 1 έως 24.
matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)
Παραγωγή:
## [,1] [,2] [,3] ## [1,] 13 17 21 ## [2,] 14 18 22 ## [3,] 15 19 23 ## [4,] 16 20 24
Παράδειγμα:
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)
Παραγωγή:
## [1] 4 6
ΣΗΜΕΊΩΣΗΟ αριθμός των γραμμών των πινάκων στην R πρέπει να είναι ίσος για να λειτουργήσει η cbind(). Όταν διαφέρουν, η R είτε ανακυκλώνει την μικρότερη είσοδο είτε εμφανίζει σφάλμα, επομένως ο έλεγχος της dim() και στα δύο αντικείμενα πρώτα είναι η ασφαλέστερη συνήθεια.
Όπου η cbind() συνενώνει στήλες, η rbind() προσθέτει γραμμές. Ας προσθέσουμε μία γραμμή στον πίνακα matrix_c και ας επαληθεύσουμε ότι η διάσταση είναι 5×3.
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3) # Create a vector of 3 columns add_row <- c(1:3) # Append to the matrix matrix_c <- rbind(matrix_c, add_row) # Check the dimension dim(matrix_c)
Παραγωγή:
## [1] 5 3
Παρατηρήστε ότι η σύνδεση ενός ονομασμένου διανύσματος όπως add_row δίνει επίσης στη νέα γραμμή αυτό το όνομα, το οποίο είναι το πρώτο βήμα προς τους πίνακες με ετικέτες που καλύπτονται παρακάτω.
Κόψτε ένα Matrix
Μπορούμε να επιλέξουμε ένα ή πολλά στοιχεία από έναν πίνακα Προγραμματισμός R χρησιμοποιώντας τις αγκύλες [ ]. Μέσα στις αγκύλες, ο επιλογέας γραμμών έρχεται πρώτος και ο επιλογέας στηλών δεύτερος, χωρισμένοι με κόμμα. Εδώ μπαίνει στο παιχνίδι η τεμαχισμός.
Για παράδειγμα:
- Το matrix_c[1,2] επιλέγει το στοιχείο στην πρώτη γραμμή και στη δεύτερη στήλη.
- Η matrix_c[1:3,2:3] έχει ως αποτέλεσμα έναν πίνακα R slice με τα δεδομένα στις γραμμές 1, 2, 3 και στις στήλες 2 και 3.
- Το matrix_c[,1] επιλέγει όλα τα στοιχεία της πρώτης στήλης.
- Το matrix_c[1,] επιλέγει όλα τα στοιχεία της πρώτης σειράς.
Επομένως, αφήνοντας μια πλευρά του κόμματος κενή, σημαίνει ότι κάθε τιμή βρίσκεται σε αυτήν την πλευρά. Μία συνέπεια αποκλείει τους αρχάριους: όταν επιλέγεται μια μεμονωμένη γραμμή ή στήλη, το R καταργεί την κενή διάσταση και επιστρέφει ένα απλό διάνυσμα. Η προσθήκη drop = FALSE, όπως στο matrix_c[1, , drop = FALSE], διατηρεί το αποτέλεσμα ως πίνακα.
Εδώ είναι η έξοδος που λαμβάνετε για τους παραπάνω κωδικούς
Ονομάστε τις γραμμές και τις στήλες ενός πίνακα στην R
Οι προεπιλεγμένες ετικέτες όπως [,1] και [3,] καθιστούν την έξοδο δυσανάγνωστη μόλις ένας πίνακας φέρει πραγματικό νόημα. Το όρισμα dimnames και οι συναρτήσεις αντικατάστασης rownames() και colnames() επισυνάπτουν ετικέτες κειμένου που στη συνέχεια ταξιδεύουν με τον πίνακα μέσω των cbind(), t() και κάθε λειτουργίας τεμαχισμού.
# Name the rows and columns while the matrix is built sales <- matrix(1:6, nrow = 2, ncol = 3, dimnames = list(c('north', 'south'), c('q1', 'q2', 'q3'))) # Or attach the names afterwards rownames(sales) <- c('north', 'south') colnames(sales) <- c('q1', 'q2', 'q3') # Read the names back as a list of two character vectors dimnames(sales) # Names make label based slicing possible sales['north', 'q2']
| Λειτουργία | Διαβάζει | Σέτς |
|---|---|---|
| dimnames(m) | Και οι δύο διαστάσεις ως λίστα δύο διανυσμάτων | dimnames(m) <- λίστα(γραμμές, στήλες) |
| ονόματα γραμμών(m) | Οι ετικέτες γραμμών | ονόματα γραμμών(m) <- γραμμές |
| ονόματα στηλών (m) | Οι ετικέτες στηλών | ονόματα στηλών(m) <- στήλες |
| αμυδρό (μ) | Γραμμές και στήλες ως δύο ακέραιοι αριθμοί | dim(m) <- c(nrow, ncol) |
Μόλις υπάρξουν οι ετικέτες, οι συναρτήσεις sales['north', 'q2'] είναι πολύ πιο σαφείς από τις συναρτήσεις sales[1, 2] και επιβιώνουν από την αναδιάταξη των γραμμών. Η ρύθμιση ενός στοιχείου dimnames σε NULL αφαιρεί ξανά αυτό το σύνολο ετικετών και ένας πίνακας που μετατρέπεται με as.data.frame() μεταφέρει τα ονόματα γραμμών και στηλών του απευθείας στο πλαίσιο δεδομένων.
Μήτρα Operaστάσεις στην R: Αριθμητική, Μεταθετική και Πολλαπλασιασμός
Στην αριθμητική σε πίνακες, ο κανόνας ενός τύπου αποδίδει. Η βασική R χειρίζεται ολόκληρο το σύνολο χωρίς επιπλέον πακέτο, αλλά δύο τελεστές συγχέονται εύκολα: ο * πολλαπλασιάζει στοιχείο προς στοιχείο, ενώ ο %*% εκτελεί γνήσιο πολλαπλασιασμό πινάκων και απαιτεί οι στήλες του αριστερού τελεστή να ταιριάζουν με τις γραμμές του δεξιού.
m1 <- matrix(1:4, nrow = 2) m2 <- matrix(5:8, nrow = 2) m1 + m2 # element by element addition m1 * m2 # element by element product, NOT matrix multiplication m1 %*% m2 # true matrix multiplication t(m1) # transpose: rows become columns solve(m1) # inverse, for a square matrix that is not singular rowSums(m1) # one total per row colMeans(m1) # one mean per column apply(m1, 1, max) # any function, applied row by row
- t(m): Μεταθέτει τον πίνακα, έτσι ώστε το στοιχείο [i, j] να γίνεται [j, i]. Τα dimnames μεταφέρονται.
- επίλυση(m)Επιστρέφει το αντίστροφο ενός τετραγωνικού, μη μοναδικού πίνακα και η solve(a, b) λύνει ένα γραμμικό σύστημα.
- rowSums / colSums / rowMeans / colMeans: Τεκμηριώνεται ως ισοδύναμο της apply() με sum ή mean, αλλά πολύ πιο γρήγορα.
- εφαρμογή(m, ΠΕΡΙΘΩΡΙΟ, ΔΙΑΣΚΕΔΑΣΗ): Το MARGIN = 1 περιηγείται στις γραμμές και το MARGIN = 2 στις στήλες, για οποιαδήποτε συνάρτηση παρέχετε.
- διάγνωση, ανίχνευση, διασταυρούμενη παραγωγή: Διαγώνιος, ορίζουσα και η ταχύτερη μορφή του t(x) %*% y.
Επειδή αυτές οι λειτουργίες είναι διανυσματοποιημένες, αντικαθιστούν τους βρόχους αντί να βρίσκονται μέσα σε αυτούς. Μια σύνοψη που θα δεχόταν έναν ένθετο βρόχο for σε χιλιάδες κελιά γίνεται μια μεμονωμένη κλήση της συνάρτησης colMeans(), η οποία έχει σημασία μόλις αυξηθούν τα δεδομένα.
Πίνακας vs Πλαίσιο Δεδομένων vs Πίνακας στην R
Οι πίνακες, τα πλαίσια δεδομένων και οι πίνακες φαίνονται ορθογώνια στην κονσόλα, ωστόσο απαντούν σε διαφορετικές ερωτήσεις. Ο πίνακας τα τοποθετεί δίπλα-δίπλα.
| Ιδιοκτησία | Μήτρα | Πλαίσιο δεδομένων | Παράταξη |
|---|---|---|---|
| Διαστάσεις | Ακριβώς 2 | Ακριβώς 2 | Οποιοσδηποτε ΑΡΙΘΜΟΣ |
| Τύποι στηλών | Ένας τύπος για ολόκληρο το αντικείμενο | Διαφορετικός τύπος ανά στήλη | Ένας τύπος για ολόκληρο το αντικείμενο |
| Χτισμένο με | μήτρα() | data.frame() | παράταξη() |
| Τυπική χρήση | Αριθμητικοί υπολογισμοί και γραμμική άλγεβρα | Μικτά δεδομένα παρατήρησης | Στοιβαγμένοι πίνακες, όπως οι μετρήσεις ανά έτος |
| Ετικέτες γραμμών | Προαιρετικά dimnames | Τα ονόματα γραμμών υπάρχουν πάντα | Προαιρετικά dimnames |
# A matrix holds one type only, so mixing coerces everything to character mixed <- matrix(c(1, 2, 'a', 'b'), nrow = 2) class(mixed[1, 1]) # Convert between the structures as.data.frame(matrix_c) as.matrix(mtcars) # A matrix is the two dimensional case of an array is.matrix(matrix_c) inherits(matrix_c, 'array')
Αναζητήστε έναν πίνακα όταν κάθε κελί είναι του ίδιου είδους αριθμός και η εργασία είναι αριθμητική. Αναζητήστε έναν πλαίσιο δεδομένων όταν οι στήλες φέρουν διαφορετικούς τύπους, για παράδειγμα ένα όνομα χαρακτήρα δίπλα σε μια αριθμητική τιμή και ένα παράγοντας. Ψάξτε για ένα λίστα όταν τα μέρη έχουν διαφορετικά μήκη, και για έναν πίνακα όταν υπάρχει πραγματικά ένας τρίτος δείκτης, όπως ο χρόνος ή η περιοχή. Η μετατροπή προς οποιαδήποτε κατεύθυνση είναι φθηνή με τις as.matrix() και as.data.frame(), έτσι ώστε η δομή να μπορεί να ακολουθεί την εργασία και όχι το αντίστροφο.





