Συνάρτηση Matrix στο R: Δημιουργία, εκτύπωση, προσθήκη στήλης και τομής

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

Ένας πίνακας στην R είναι ένας δισδιάστατος πίνακας που περιέχει έναν μόνο τύπο δεδομένων σε m γραμμές και n στήλες, που κατασκευάζεται με matrix(), επεκτείνεται με cbind() και rbind() και προσεγγίζεται μέσω αγκυλών.

  • 🧩 Δομή: Ένας πίνακας είναι ένα διάνυσμα με ένα χαρακτηριστικό dim, επομένως κάθε κελί πρέπει να μοιράζεται έναν τύπο δεδομένων.
  • ️ Δημιουργία: Η matrix(data, nrow, ncol, byrow) οργανώνει μια ακολουθία και η R συνάγει την ελλείπουσα διάσταση.
  • 🔄 Συμπλήρωση παραγγελίας: Η επιλογή byrow = FALSE γεμίζει στήλη προς στήλη, ενώ η επιλογή byrow = TRUE γεμίζει γραμμή προς γραμμή.
  • ➕ Ανάπτυξη: Η cbind() προσθέτει στήλες και η rbind() προσθέτει γραμμές, εφόσον η κοινόχρηστη διάσταση ταιριάζει.
  • ✂ Τεμαχισμός: m[γραμμή, στήλη] διαβάζει πρώτα τις γραμμές και μια κενή πλευρά επιλέγει όλα όσα βρίσκονται σε αυτήν την πλευρά.
  • 🏷️ Ετικέτες: Οι συναρτήσεις dimnames, rownames() και colnames() αντικαθιστούν τα placeholders [,1] με αναγνώσιμα ονόματα.
  • ➕➖ Αριθμητική: Ο αστερίσκος πολλαπλασιάζει στοιχείο προς στοιχείο, ενώ ο %*% εκτελεί πολλαπλασιασμό πινάκων.

Συνάρτηση πίνακα στο R Δημιουργία εκτύπωσης Προσθήκη στήλης και τομής

Συνάρτηση Matrix στο R

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

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

Σημείωση: Η ίδια η matrix() επιστρέφει πάντα ακριβώς δύο διαστάσεις. Για να δημιουργήσετε μια δομή με τρεις ή περισσότερες διαστάσεις στην R, χρησιμοποιήστε τον πίνακα() με ένα διάνυσμα dim ή αντιστοιχίστε απευθείας την dim(). Το παρακάτω διάγραμμα δείχνει τη διάταξη γραμμών και στηλών που ακολουθεί κάθε πίνακας.

Διάταξη γραμμών και στηλών μιας συνάρτησης πίνακα στην R

Πώς να δημιουργήσετε ένα 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 συμπληρώνεται γραμμή προς γραμμή με byrow = TRUE

Τώρα, ας εκτυπώσουμε τη διάσταση του πίνακα σε 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 συμπληρώνεται στήλη προς στήλη με byrow = FALSE

Και πάλι, εκτυπώστε τη διάσταση του πίνακα χρησιμοποιώντας 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

Ονομάστε τις γραμμές και τις στήλες ενός πίνακα στην 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(), έτσι ώστε η δομή να μπορεί να ακολουθεί την εργασία και όχι το αντίστροφο.

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

Το R ανακυκλώνει τις τιμές αντί να τις απορρίπτει, επομένως το matrix(1:3, nrow = 2, ncol = 3) επαναλαμβάνει την ακολουθία. Μια προειδοποίηση εμφανίζεται μόνο όταν το μήκος δεν είναι ακριβές πολλαπλάσιο του αριθμού των κελιών, γεγονός που καθιστά την σιωπηλή ανακύκλωση ένα σφάλμα που εύκολα παραβλέπεται.

Χρησιμοποιήστε έναν αρνητικό δείκτη: m[-2, ] αφαιρεί τη δεύτερη γραμμή και m[, -3] αφαιρεί την τρίτη στήλη. Πολλές μπορούν να αφαιρεθούν ταυτόχρονα με m[-c(1, 4), ]. Το αρχικό αντικείμενο παραμένει αμετάβλητο μέχρι να αντιστοιχίσετε ξανά το αποτέλεσμα.

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

Η which(m == value, arr.ind = TRUE) επιστρέφει ένα αποτέλεσμα δύο στηλών που δίνει τη γραμμή και τη στήλη κάθε αντιστοίχισης. Χωρίς το arr.ind η απάντηση είναι ένας μόνο γραμμικός δείκτης που μετράει προς τα κάτω τις στήλες, κάτι που σπάνια είναι αυτό που θέλετε.

Χρησιμοποιήστε array(data, dim = c(rows, columns, layers)) ή αντιστοιχίστε την dim(x) απευθείας σε ένα διάνυσμα. Στη συνέχεια, η τεμαχισμός λαμβάνει έναν δείκτη ανά διάσταση, όπως a[2, 3, 1]. Ένας πίνακας είναι απλώς η δισδιάστατη περίπτωση ενός πίνακα.

Ναι. Η βασική αναφορά R δηλώνει ότι οι συναρτήσεις rowSums και colMeans είναι ισοδύναμες με την apply() με sum ή mean αλλά πολύ πιο γρήγορα, και αμφότερες ξεπερνούν έναν σαφή βρόχο for επειδή η επανάληψη συμβαίνει σε μεταγλωττισμένο κώδικα και όχι στον διερμηνέα.

Η προσαρμογή του μοντέλου είναι γραμμική άλγεβρα: τα χαρακτηριστικά σχηματίζουν έναν πίνακα, οι συντελεστές σχηματίζουν ένα διάνυσμα και η πρόβλεψη είναι ένα μοναδικό γινόμενο %*%. Πολλοί μάθηση μηχανής Συνεπώς, τα πακέτα απαιτούν έναν αριθμητικό πίνακα αντί για ένα πλαίσιο δεδομένων ως είσοδο.

Ναί. GitHub Copilot εκτελείται σε RStudio 2023.09.0 και νεότερες εκδόσεις και ολοκληρώνει τον κώδικα από τα σχόλια στο ανοιχτό αρχείο. Ελέγξτε τη λογική των διαστάσεών του στο Rstudio, επειδή ένα λάθος nrow εξακολουθεί να παράγει έναν έγκυρο πίνακα.

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