Matrixfunktion in R: Erstellen, Drucken, Hinzufügen von Spalten und Segmenten

⚡ Intelligente Zusammenfassung

Eine Matrix in R ist ein zweidimensionales Array, das einen einzigen Datentyp über m Zeilen und n Spalten enthält. Sie wird mit matrix() erstellt, mit cbind() und rbind() erweitert und über eckige Klammern aufgerufen.

  • 🧩 Struktur: Eine Matrix ist ein Vektor mit einem dim-Attribut, daher müssen alle Zellen denselben Datentyp haben.
  • Schaffung: matrix(data, nrow, ncol, byrow) ordnet eine Sequenz an, und R leitet die fehlende Dimension ab.
  • 🔄 Auftrag ausführen: byrow = FALSE füllt die Spalte spaltenweise, während byrow = TRUE die Zeile zeilenweise füllt.
  • Wachstum: cbind() fügt Spalten und rbind() Zeilen hinzu, vorausgesetzt, die gemeinsame Dimension stimmt überein.
  • Schneiden: m[Zeile, Spalte] liest zuerst die Zeilen, und eine leere Seite wählt alles auf dieser Seite aus.
  • 🏷️ Etiketten: dimnames(), rownames() und colnames() ersetzen die Platzhalter [,1] durch lesbare Namen.
  • ➕➖ Arithmetik: Der Stern multipliziert die Elemente einzeln, während %*% eine Matrixmultiplikation durchführt.

Matrixfunktionen in R: Erstellen, Drucken, Spalten und Segmente hinzufügen

Matrixfunktion in R

Eine Matrixfunktion in R ist ein zweidimensionales Array mit m Zeilen und n Spalten. Mit anderen Worten: Eine Matrix in der R-Programmierung ist eine Kombination aus zwei oder mehr Vektoren mit demselben Datentyp.

Im Grunde ist eine Matrix ein Vektor mit einem zweidimensionalen `dim`-Attribut. Deshalb müssen alle Elemente denselben Datentyp haben: Sobald ein Zeichenwert auf eine Zahl trifft, wird die gesamte Matrix in einen Zeichenwert umgewandelt. R speichert die Werte spaltenweise und verwendet `dim`, um das Zeilenende festzulegen. Datentyp gilt für das gesamte Objekt auf einmal.

Hinweis: Die Funktion `matrix()` liefert immer genau zwei Dimensionen. Um in R eine Struktur mit drei oder mehr Dimensionen zu erstellen, verwenden Sie `array()` mit einem Dimensionsvektor oder weisen Sie `dim()` den Wert direkt zu. Das folgende Diagramm zeigt das Zeilen- und Spaltenlayout, dem jede Matrix folgt.

Zeilen- und Spaltenlayout einer Matrixfunktion in R

So erstellen Sie eine Matrix in R

Wir können mit der Funktion eine Matrix erstellen. Matrix()Die Basissignatur von R benötigt fünf Argumente, von denen die drei am häufigsten verwendeten hier aufgeführt sind:

matrix(data, nrow, ncol, byrow = FALSE)

Argumente:

  • frustriertenDie Menge der Elemente, die R in den Zeilen und Spalten der Matrix anordnet.
  • jetzt: Anzahl der Zeilen.
  • ncol: Anzahl der Spalten.
  • byrowEin logischer Parameter. Bei der Standardeinstellung byrow = FALSE wird die Matrix spaltenweise von oben nach unten gefüllt. Bei byrow = TRUE wird sie zeilenweise von links nach rechts gefüllt.
  • DimensionsnamenEine optionale Liste der Länge zwei, die die Zeilennamen und Spaltennamen angibt.

Zwei Details aus der R-Referenz sind vor dem ersten Beispiel wichtig. Wenn nur eine der beiden Variablen `nrow` oder `ncol` angegeben ist, leitet R die andere aus der Datenlänge ab. Und wenn die Daten zu wenige Elemente enthalten, um die gewünschte Form zu erreichen, werden die Werte wiederverwendet, anstatt verworfen zu werden.

Um den Unterschied zu sehen, konstruieren wir zwei 5×2-Matrizen aus der Zahlenfolge von 1 bis 10, eine mit byrow = TRUE und eine mit 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

Ausgang:

Da byrow = TRUE verwendet wurde, füllt die Konsole die erste Zeile mit 1 und 2, die zweite Zeile mit 3 und 4 usw.

Konsolenausgabe von matrix_a, zeilenweise gefüllt mit byrow = TRUE

Lassen Sie uns nun die Dimension der Matrix in R mit dim() drucken. Die Syntax zum Drucken einer Matrix in R mit dim() lautet:

# Print dimension of the matrix with dim()
dim(matrix_a)

Ausgang:

## [1] 5 2

dim() gibt zuerst die Zeilenanzahl und dann die Spaltenanzahl zurück und bestätigt damit die 5×2-Form.

Eine Matrix spaltenweise füllen mit byrow = FALSE

Die gleichen zehn Zahlen und die gleiche Zeilenanzahl ergeben eine andere Anordnung, sobald die Füllrichtung geändert wird. Keeping Die Standardeinstellung von byrow sendet die Werte in die erste Spalte, bevor die zweite Spalte beginnt.

# 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

Ausgang:

Konsolenausgabe von matrix_b, spaltenweise gefüllt mit byrow = FALSE

Drucken Sie erneut die Dimension der Matrix mit dim() aus. Nachfolgend finden Sie eine Syntax der R-Druckmatrixdimension:

# Print dimension of the matrix with dim()
dim(matrix_b)

Ausgang:

## [1] 5 2

Die Form bleibt bei 5×2 unverändert, da byrow die Füllreihenfolge ändert, niemals aber die Abmessungen.

HinweisDie Verwendung des Befehls matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) hat den gleichen Effekt wie oben, da R aus den zehn angegebenen Werten nrow = 5 ableitet.

Sie können auch eine 4×3-Matrix mit ncol erstellen. R erstellt dann drei Spalten und füllt jede Spalte von oben nach unten. Sehen Sie sich ein Beispiel an.

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c

Ausgang:

##       [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12

Die Spaltenüberschriften [,1] bis [,3] und die Zeilenbeschriftungen [1,] bis [4,] sind Standardplatzhalter in R. Sie verschwinden, sobald echte Dimensionsnamen angegeben werden, wie später in diesem Tutorial gezeigt wird.

Ejemplo:

dim(matrix_c)

Ausgang:

## [1] 4 3

Mit cbind() eine Spalte zu einer Matrix hinzufügen

Mit dem Befehl `cbind()` können Sie einer Matrix in R Spalten hinzufügen. `cbind()` bedeutet Spaltenverknüpfung und kann beliebig viele Matrizen oder Spalten verketten. In unserem vorherigen Beispiel wurde eine 5×2-Matrix erstellt. Wir fügen eine dritte Spalte hinzu und überprüfen, ob die Dimension nun 5×3 beträgt.

Ejemplo:

# concatenate c(1:5) to the matrix_a
matrix_a1 <- cbind(matrix_a, c(1:5))
# Check the dimension
dim(matrix_a1)

Ausgang:

## [1] 5 3

Ejemplo:

matrix_a1

Ausgang

##       [,1] [,2] [,3]
## [1,]    1    2    1
## [2,]    3    4    2
## [3,]    5    6    3
## [4,]    7    8    4
## [5,]    9   10    5

Ejemplo:

Wir können auch mehrere Spalten gleichzeitig verknüpfen. Der nächste Block erstellt die Matrix_a2, eine 4×3-Matrix mit den Zahlen 13 bis 24, die dann mit der 4×3-Matrix_c zu einer 4×6-Matrix verknüpft wird, die die Zahlen von 1 bis 24 abdeckt.

matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)

Ausgang:

##      [,1] [,2] [,3]
## [1,]   13   17   21
## [2,]   14   18   22
## [3,]   15   19   23
## [4,]   16   20   24

Ejemplo:

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)		
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)

Ausgang:

## [1] 4 6

HINWEISDie Matrizen in R müssen die gleiche Zeilenanzahl haben, damit `cbind()` funktioniert. Bei einer Abweichung verwendet R entweder die kürzere Eingabe erneut oder löst einen Fehler aus. Daher ist es sicherer, zuerst `dim()` für beide Objekte zu verwenden.

Während `cbind()` Spalten verkettet, fügt `rbind()` Zeilen an. Fügen wir unserer Matrix `matrix_c` eine Zeile hinzu und überprüfen wir, ob die Dimension 5×3 beträgt.

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)

Ausgang:

## [1] 5 3

Beachten Sie, dass durch das Binden eines benannten Vektors wie add_row auch die neue Zeile diesen Namen erhält. Dies ist der erste Schritt hin zu den weiter unten behandelten beschrifteten Matrizen.

Schneiden Sie eine Matrix

Wir können ein oder mehrere Elemente aus einer Matrix auswählen. R Programmierung Mithilfe der eckigen Klammern [ ] wird die Zeilenauswahl durch ein Komma getrennt, gefolgt von der Spaltenauswahl. Hier kommt das Slicing ins Spiel.

Beispielsweise:

  • matrix_c[1,2] wählt das Element in der ersten Zeile und zweiten Spalte aus.
  • matrix_c[1:3,2:3] ist eine R-Slice-Matrix, deren Daten sich in den Zeilen 1, 2, 3 und den Spalten 2 und 3 befinden.
  • matrix_c[,1] wählt alle Elemente der ersten Spalte aus.
  • matrix_c[1,] wählt alle Elemente der ersten Zeile aus.

Lässt man eine Seite des Kommas leer, bedeutet das, dass alle Werte auf dieser Seite berücksichtigt werden. Anfänger werden dabei oft getäuscht: Wählt man eine einzelne Zeile oder Spalte aus, entfernt R die leere Dimension und gibt einen einfachen Vektor zurück. Mit `drop = FALSE`, wie in `matrix_c[1, , drop = FALSE]`, bleibt das Ergebnis eine Matrix.

Hier ist die Ausgabe, die Sie für die oben genannten Codes erhalten

Konsolenergebnisse der vier Matrix-Slicing-Ausdrücke in R

Benennen Sie die Zeilen und Spalten einer Matrix in R

Standardmäßige Bezeichnungen wie [,1] und [3,] erschweren die Lesbarkeit der Ausgabe, sobald eine Matrix eine tatsächliche Bedeutung hat. Das Argument `dimnames` sowie die Ersatzfunktionen `rownames()` und `colnames()` fügen Textbezeichnungen hinzu, die dann bei der Matrixverarbeitung durch `cbind()`, `t()` und jede Slicing-Operation erhalten bleiben.

# 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']
Funktion Liest Sets
dimnames(m) Beide Dimensionen als Liste von zwei Vektoren dimnames(m) <- list(rows, cols)
Zeilennamen(m) Die Zeilenbeschriftungen rownames(m) <- rows
Spaltennamen(m) Die Spaltenbezeichnungen colnames(m) <- cols
dim(m) Zeilen und Spalten als zwei ganze Zahlen dim(m) <- c(nrow, ncol)

Sobald die Bezeichnungen vorhanden sind, ist sales['north', 'q2'] deutlich verständlicher als sales[1, 2] und bleibt auch nach einer Neuanordnung der Zeilen erhalten. Setzt man die Komponente dimnames auf NULL, werden diese Bezeichnungen wieder entfernt, und eine mit as.data.frame() konvertierte Matrix übernimmt ihre Zeilen- und Spaltennamen direkt. Datenrahmen.

Matrix OperaGrundlagen in R: Arithmetik, Transponieren und Multiplizieren

Bei der Arithmetik mit Matrizen zahlt sich die Ein-Typ-Regel aus. R-Basis unterstützt alle Operationen ohne zusätzliche Pakete, doch zwei Operatoren können leicht verwechselt werden: * multipliziert Elemente miteinander, während %*% eine echte Matrixmultiplikation durchführt und voraussetzt, dass die Spalten des linken Operanden mit den Zeilen des rechten übereinstimmen.

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)Die Matrix wird transponiert, sodass das Element [i, j] zu [j, i] wird. Die Dimensionsnamen werden übernommen.
  • solve(m)Gibt die Inverse einer quadratischen, nicht-singulären Matrix zurück, und solve(a, b) löst ein lineares Gleichungssystem.
  • Zeilensummen / Spaltensummen / Zeilenmittelwerte / Spaltenmittelwerte: Dokumentiert als gleichwertig zu apply() mit sum oder mean, aber wesentlich schneller.
  • apply(m, MARGIN, FUN): MARGIN = 1 durchläuft die Zeilen und MARGIN = 2 durchläuft die Spalten, für jede von Ihnen angegebene Funktion.
  • Diagnose, Detektion, Kreuzprodukt: Diagonale, Determinante und die schnellere Form von t(x) %*% y.

Da diese Operationen vektorisiert sind, ersetzen sie Schleifen, anstatt in ihnen enthalten zu sein. Eine Zusammenfassung, die normalerweise eine verschachtelte for-Schleife über Tausende von Zellen benötigen würde, wird zu einem einzigen Aufruf von colMeans(), was sich insbesondere bei wachsenden Datenmengen bemerkbar macht.

Matrix vs. Data Frame vs. Array in R

Matrizen, Dataframes und Arrays sehen in der Konsole alle rechteckig aus, beantworten aber unterschiedliche Fragen. Die Tabelle stellt sie nebeneinander dar.

Eigenschaft Matrix Datenrahmen Feld
Abmessungen Genau 2 Genau 2 Irgendeine Nummer
Spaltentypen Ein Typ für das gesamte Objekt Ein anderer Typ pro Spalte Ein Typ für das gesamte Objekt
Design mit Matrix() data.frame() array ()
Typische Verwendung Numerische Berechnungen und lineare Algebra Gemischte Beobachtungsdaten Gestapelte Tabellen, wie z. B. Zählungen nach Jahr
Zeilenbeschriftungen Optionale Dimensionsnamen Zeilennamen sind immer vorhanden Optionale Dimensionsnamen
# 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')

Verwenden Sie eine Matrix, wenn alle Zellen Zahlen desselben Typs enthalten und es sich um arithmetische Berechnungen handelt. Datenrahmen wenn Spalten unterschiedliche Datentypen enthalten, zum Beispiel einen Zeichennamen neben einem numerischen Preis und einem FaktorGreifen Sie nach einem Liste Wenn die Teile unterschiedliche Längen haben und bei einem Array ein dritter Index wie Zeit oder Region tatsächlich existiert, ist die Konvertierung mit `as.matrix()` und `as.data.frame()` in beide Richtungen effizient. Daher kann die Struktur der Aufgabe folgen und nicht umgekehrt.

Häufig gestellte Fragen

R verwendet die Werte wieder, anstatt sie zu verwerfen. Daher wiederholt `matrix(1:3, nrow = 2, ncol = 3)` die Sequenz. Eine Warnung erscheint nur, wenn die Länge kein exaktes Vielfaches der Zellenzahl ist. Dadurch kann die stille Wiederverwendung leicht übersehen werden.

Verwenden Sie einen negativen Index: `m[-2, ]` entfernt die zweite Zeile und `m[, -3]` die dritte Spalte. Mehrere Zeilen können gleichzeitig entfernt werden mit `m[-c(1, 4), ]`. Das ursprüngliche Objekt bleibt unverändert, bis Sie das Ergebnis wieder zuweisen.

Die Auswahl einer einzelnen Zeile oder Spalte entfernt standardmäßig die leere Dimension. Um eine einzeilige Matrix zu erhalten, fügen Sie `drop = FALSE` hinzu, z. B. `m[1, , drop = FALSE]`. Dies ist relevant, wenn das Ergebnis an eine Funktion übergeben wird, die zwei Dimensionen erwartet.

`which(m == value, arr.ind = TRUE)` liefert ein zweispaltiges Ergebnis mit Zeile und Spalte jeder Übereinstimmung. Ohne `arr.ind` erhält man einen einzelnen linearen Index, der die Spalten durchläuft, was selten gewünscht ist.

Verwenden Sie `array(data, dim = c(rows, columns, layers))` oder weisen Sie `dim(x)` direkt einem Vektor zu. Beim Slicing wird dann ein Index pro Dimension verwendet, z. B. `a[2, 3, 1]`. Eine Matrix ist einfach der zweidimensionale Fall eines Arrays.

Ja. Die R-Basisreferenz besagt, dass rowSums und colMeans äquivalent zu apply() mit sum oder mean sind, aber viel schneller, und beide sind einer expliziten for-Schleife überlegen, da die Iteration im kompilierten Code und nicht im Interpreter erfolgt.

Die Modellanpassung ist lineare Algebra: Merkmale bilden eine Matrix, Koeffizienten einen Vektor, und die Vorhersage ist ein einzelnes %*%-Produkt. Viele Maschinelles Lernen Die Pakete benötigen daher eine numerische Matrix anstelle eines Datenrahmens als Eingabe.

Ja. GitHub-Copilot Läuft in RStudio 2023.09.0 und höher und vervollständigt Code anhand der Kommentare in der geöffneten Datei. Überprüfen Sie die Dimensionslogik in RStudioDenn selbst bei falscher Anzahl an Zeilen (nrow) entsteht eine gültige Matrix.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: