8  Matrizen

Im Kapitel Vektoren haben wir eine Möglichkeit kennen gelernt, mehrere Werte “aneinander zu reihen” und in einer neuen Variable zu speichern. Als Beispiel hatten wir die Y-BOCS Werte eines Patienten in der Variable ybocs gespeichert:

ybocs <- c(3, 4, 2, 0, 2, 0, 3, 2, 1, 1)

Häufig haben wir es aber mit Daten von mehr als einer Person zu tun. Beispielsweise haben Farris et al. (2013) die Y-BOCS Werte von 288 Patient:innen analysiert. Selbst mit Vektoren wäre das extrem aufwendig:

ybocs_person_1 <- c(3, 4, 2, 0, 2, 0, 3, 2, 1, 1)
ybocs_person_2 <- c(0, 4, 3, 4, 2, 2, 1, 2, 2, 4)
ybocs_person_3 <- c(3, 4, 3, 3, 0, 3, 3, 3, 4, 0)
ybocs_person_4 <- c(1, 3, 3, 0, 1, 3, 2, 0, 0, 3) 
#    .          .               .
#    .          .               .
#    .          .               .
ybocs_person_288 <- c(4, 4, 2, 3, 2, 0, 3, 1, 2, 2)

Stattdessen nutzen wir hier üblicherweise Tabellen, um die Daten zu speichern:

         frage 1 frage 2 frage 3 frage 4 frage 5 frage 6 frage 7 frage 8
person 1       3       4       2       0       2       0       3       2
person 2       0       4       3       4       2       2       1       2
person 3       3       4       3       3       0       3       3       3
person 4       1       3       3       0       1       3       2       0
person 5       3       3       3       3       4       1       0       0
person 6       0       2       1       3       4       1       3       1
         frage 9 frage 10
person 1       1        1
person 2       2        4
person 3       4        0
person 4       0        3
person 5       1        2
person 6       4        1

Matrizen sind eine Form solcher Tabellen: Sie sind wie Vektoren, aber haben sowohl Zeilen als auch Spalten. Matrizen erstellen wir mit matrix():

m <- matrix(
  # Werte, die in der Matrix stehen sollen:
  data = c(1, 2, 3,
           4, 5, 6),
  # Wie viele Zeilen hat die Matrix?
  nrow = 2, 
  # Wie viele Spalten hat die Matrix?
  ncol = 3)
m
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

Fällt Dir etwas auf? Die Werte sind anders angeordnet als wir wahrscheinlich vermutet haben. Der Grund hierfür ist, dass R “in Spalten denkt”. Das heißt, R füllt unsere Matrix spaltenweise auf. Wenn wir stattdessen zeilenweise vorgehen wollen, müssen wir den Befehl etwas anpassen:

m <- matrix(
  # Werte, die in der Matrix stehen sollen:
  data = c(1, 2, 3,
           4, 5, 6),
  # Wie viele Zeilen hat die Matrix?
  nrow = 2, 
  # Wie viele Spalten hat die Matrix?
  ncol = 3,
  # Zeilenweises auffüllen
  byrow = TRUE)
m
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6

Schon besser!

Erstelle nun eine neue Matrix mit dem Namen ybocs, in der die ersten vier Personen aus unserem Y-BOCS Datensatz gespeichert sind.

Lösung anzeigen
ybocs <- matrix(c(3, 4, 2, 0, 2, 0, 3, 2, 1, 1,
                  0, 4, 3, 4, 2, 2, 1, 2, 2, 4,
                  3, 4, 3, 3, 0, 3, 3, 3, 4, 0,
                  1, 3, 3, 0, 1, 3, 2, 0, 0, 3), 
                nrow = 4, 
                ncol = 10, 
                byrow = TRUE)
ybocs
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    3    4    2    0    2    0    3    2    1     1
[2,]    0    4    3    4    2    2    1    2    2     4
[3,]    3    4    3    3    0    3    3    3    4     0
[4,]    1    3    3    0    1    3    2    0    0     3

8.1 Werte aus einer Tabelle herausgreifen

Um auf Werte einer Tabelle zuzugreifen, müssen wir wieder die Eckigen Klammern verwenden. Bei einem Vektor ging dies folgendermaßen:

my_vector <- c(1,2,6,4)
# erstes Element herausgreifen:
my_vector[1]
[1] 1

Unsere Matrizen haben nun aber sowohl Zeilen als auch Spalten!

print(ybocs)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    3    4    2    0    2    0    3    2    1     1
[2,]    0    4    3    4    2    2    1    2    2     4
[3,]    3    4    3    3    0    3    3    3    4     0
[4,]    1    3    3    0    1    3    2    0    0     3

Wir müssen daher auch sowohl die Zeile als auch die Spalte angeben, in der der uns interessierende Wert steht. Wollen wir beispielsweise den Wert der ersten Person (erste Zeile) auf der 3. Frage (3. Spalte), müssen wir folgendes eingeben:

ybocs[1, 3]
[1] 2

Wir schreiben hier also ybocs[zeile, spalte]. Wir können auch alle Werte der ersten Person auf einmal herausgreifen. Hierfür lassen wir die Spalte (die Frage) frei:

ybocs[1, ]
 [1] 3 4 2 0 2 0 3 2 1 1

Wenn wir alle Werte einer Frage haben wollen, lassen wir die Zeile frei:

ybocs[ , 3] # Werte der dritten Frage
[1] 2 3 3 3
Versuche nun den Wert der 4. Person auf der 10. Frage herauszugreifen.
Lösung anzeigen
ybocs[4, 10]
[1] 3

Genauso wie Vektoren können auch Matrizen nur Daten von einem Typ speichern. Ersetze den Wert in Zeile 4, Spalte 1 der ybocs Matrix durch “abc”. Was passiert mit der Matrix?

Lösung anzeigen
ybocs[4, 1] <- "abc"
ybocs
     [,1]  [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "3"   "4"  "2"  "0"  "2"  "0"  "3"  "2"  "1"  "1"  
[2,] "0"   "4"  "3"  "4"  "2"  "2"  "1"  "2"  "2"  "4"  
[3,] "3"   "4"  "3"  "3"  "0"  "3"  "3"  "3"  "4"  "0"  
[4,] "abc" "3"  "3"  "0"  "1"  "3"  "2"  "0"  "0"  "3"  
Alle Werte wurden zu Text umgewandelt! Wir können Text und Zahlen nicht in einer Matrix speichern!