R
. Sitzung 2: Faktoren und ObjekteNachdem in der letzten Sitzung eine Einführung in R
als
statistisches Datenanalyseprogramm gegeben wurde, wollen wir uns ab
dieser Sitzung auf die Arbeit mit Datensätzen konzentrieren. Bevor wir
uns in Sitzung 3 mit den Datensätzen dieses Kurses beschäftigen, wollen
wir uns in dieser Sitzung einen Überblick über die zweidimensionalen
Objektklassen Matrix und Dataframe verschaffen. Dataframes sind ein
wichtiges Objekt in R
, da fast alle Datensätze in diesem
Format vorliegen. Außerdem lernen wir mit den Faktoren eine weitere
eindimensionale Objektklasse kennen.
Matrizen sind Vektoren mit zwei Dimensionen. Im Gegensatz dazu haben
Vektoren nur eine Dimension. Daten in Form von Matrizen sind wie in
einer klassischen Tabelle in Zeilen und Spalten angeordnet. Dies hat zur
Folge, dass innerhalb einer Matrix jede Zeile und jede Spalte gleich
lang sein muss. Wäre eine Spalte oder Zeile länger oder kürzer, würde
dies zu leeren Zellen innerhalb der Matrix führen. Dies würde
R
bei bestimmten Berechnungen stören. Im Allgemeinen
verhalten sich Matrizen wie Vektoren. Dies bezieht sich insbesondere
darauf, dass sie immer nur eine Klasse von Objekten enthalten können.
Die Elemente einer Matrix können also z.B. entweder nur Zeichenvektoren
oder nur Zahlenvektoren sein, aber niemals beides gleichzeitig.
Wir bilden eine Matrix in R
so:
m <- matrix(data = 1:6, nrow = 2, ncol = 3)
m
1 | 3 | 5 |
2 | 4 | 6 |
Die Funktion matrix()
enthält die Argumente
data
, das die Daten in der Matrix angibt, nrow
(für “number of rows”), das die Anzahl der Zeilen angibt, und
ncol
(für “number of columns”), das die Anzahl der Spalten
angibt. Die Matrix wird spaltenweise mit den angegebenen Werten gefüllt:
1 und 2 in der ersten Spalte, 3 und 4 in der zweiten Spalte und 5 und 6
in der dritten Spalte. Die Art und Weise, wie R
beim Füllen
der Matrix vorgeht, kann durch das Argument byrow
bestimmt
werden, dessen default, also die Voreinstellung FALSE
ist.
Wir setzen byrow
auf TRUE
. Nun füllt
R
die Matrix zeilenweise mit Werten, so dass 1, 2 und 3 in
der ersten Zeile und 4, 5 und 6 in der zweiten Zeile stehen.
m <- matrix(1:6, nrow = 2, byrow = TRUE)
m
1 | 2 | 3 |
4 | 5 | 6 |
Eine weitere Möglichkeit, Matrizen zu erstellen, ist das
Zusammenbinden von Vektoren. Dazu verwendet man entweder
cbind()
(“column bind”) zum Verbinden von Spalten oder
rbind()
(“row bind”) zum Verbinden von Zeilen. Wichtig ist,
dass die zu verbindenden Vektoren vom gleichen Typ sind.
x <- 6:9
y <- 20:23
cbind(x, y)
x | y |
---|---|
6 | 20 |
7 | 21 |
8 | 22 |
9 | 23 |
rbind(x, y)
x | 6 | 7 | 8 | 9 |
y | 20 | 21 | 22 | 23 |
Wie in der Ausgabe zu sehen ist, bleiben die Namen der Vektoren
x
und y
als Zeilen- bzw. Spaltennamen in der
Matrix erhalten. Mit rownames()
und colnames()
können wir die Zeilen- und Spaltennamen ändern. Dies wird empfohlen,
damit Objekte für Sie und andere verständlich bleiben.
z <- cbind(x, y)
colnames(z) <- c("einstellig", "zweistellig")
z
einstellig | zweistellig |
---|---|
6 | 20 |
7 | 21 |
8 | 22 |
9 | 23 |
rownames(z) <- c("erste", "zweite", "dritte", "vierte")
z
einstellig | zweistellig | |
---|---|---|
erste | 6 | 20 |
zweite | 7 | 21 |
dritte | 8 | 22 |
vierte | 9 | 23 |
Dataframes sind die übliche Form, in der tabellarische Daten in
R
gespeichert werden. Dies macht sie zu einem der
wichtigsten Objekttypen in R
. Dataframes können einerseits
mit Funktionen zum Laden von externen Datensätzen erstellt werden. Dies
wird Thema der nächsten Sitzung sein. Zum anderen können Dataframes auch
direkt mit der Funktion data.frame()
erzeugt werden. Dies
funktioniert ähnlich wie die Bildung von Matrizen und wird hier kurz
vorgestellt.
Auch bei Dataframes müssen alle Zeilen und Spalten gleich lang sein.
Im Gegensatz zu Matrizen ist es jedoch möglich, Elemente verschiedener
Klassen miteinander zu kombinieren. Dies ist vor allem bei komplexeren
Analysen von Vorteil. Dataframes können manuell erstellt werden, indem
man in der Funktion data.frame()
die Spalten, die sie
zusammenfassen, also unsere Variablen, nacheinander mit Namen und Inhalt
in Klammern angibt. In diesem Beispiel für die Variablen x
und y
:
df <- data.frame(x = 1:4, y = c(TRUE, TRUE, FALSE, FALSE))
df
x | y |
---|---|
1 | TRUE |
2 | TRUE |
3 | FALSE |
4 | FALSE |
Wenn wir df
ausgeben lassen, zeigt die Ausgabe die
Variablennamen x
und y
oben und eine
automatische Nummerierung der Spalten links. In einem etwas größeren
Beispiel haben wir einen Auszug aus fiktiven Daten eines Experiments.
Dieser Datensatz enthält Informationen über eine Identifikationsnummer
identifikation
und darüber, ob es sich um die
Experimentalgruppe oder die Kontrollgruppe (bedingung
)
handelt. Darüber hinaus liegen die soziodemographischen Variablen
geschlecht
und alter
sowie die Ergebnisse des
Experiments zu zwei verschiedenen Zeitpunkten (wert_t1
und
wert_t2
) vor. Alle Daten liegen für sechs Teilnehmende
vor.
df <- data.frame(identifikation = 1:6,
bedingung = c("E", "E", "C", "C", "C", "E"),
geschlecht = c("M", "M", "W", "M", "W", "W"),
alter = c(17, 19, 22, 18, 16, 21),
wert_t1 = c(8.0, 6.0, 7.5, 6.8, 8.0, 6.4),
wert_t2 = c(8.3, 6.4, 7.7, 6.3, 7.5, 6.4))
df
identifikation | bedingung | geschlecht | alter | wert_t1 | wert_t2 |
---|---|---|---|---|---|
1 | E | M | 17 | 8.0 | 8.3 |
2 | E | M | 19 | 6.0 | 6.4 |
3 | C | W | 22 | 7.5 | 7.7 |
4 | C | M | 18 | 6.8 | 6.3 |
5 | C | W | 16 | 8.0 | 7.5 |
6 | E | W | 21 | 6.4 | 6.4 |
Nun wird der große Vorteil von Dataframes deutlich: Sie ermöglichen es, Informationen unterschiedlicher Klassen zu kombinieren. Für jede Beobachtung ist also jede Form von Information verfügbar, die benötigt wird. In einer Matrix wäre dies nicht möglich.
Es gibt eine weitere Möglichkeit, Dataframes zu erstellen. Dazu
benötigen wir eine Matrix, die dann in einen Dataframe umgewandelt wird.
In diesem Beispiel wandeln wir die oben erstellte Matrix z
in einen Dataframe um. Dazu verwenden wir die Funktion
as.data.frame()
.
dfz <- as.data.frame(z)
dfz
einstellig | zweistellig | |
---|---|---|
erste | 6 | 20 |
zweite | 7 | 21 |
dritte | 8 | 22 |
vierte | 9 | 23 |
R
liefert auch Funktionen für den umgekehrten Weg.
Allerdings werden alle enthaltenen Elemente mittels implicit
coercion umgewandelt. Wird die Funktion as.matrix()
verwendet, werden alle Eingaben in characters umgewandelt. Wird
die Funktion data.matrix()
verwendet, werden alle Einträge
in numerische Werte konvertiert. Hier ist ein Beispiel für den letzteren
Fall.
dfm <- data.matrix(df)
dfm
identifikation | bedingung | geschlecht | alter | wert_t1 | wert_t2 |
---|---|---|---|---|---|
1 | 2 | 1 | 17 | 8.0 | 8.3 |
2 | 2 | 1 | 19 | 6.0 | 6.4 |
3 | 1 | 2 | 22 | 7.5 | 7.7 |
4 | 1 | 1 | 18 | 6.8 | 6.3 |
5 | 1 | 2 | 16 | 8.0 | 7.5 |
6 | 2 | 2 | 21 | 6.4 | 6.4 |
Wie wir sehen, kam es bei der Umwandlung in eine Matrix zu dem
typischen Informationsverlust durch implicit coercion, da die
Variablen bedingung
und geschlecht
in Zahlen
umgewandelt wurden. Um einen Informationsverlust vorzubeugen, sind diese
Funktionen zu vermeiden.
Oft ist es nützlich, die in einem Datensatz enthaltenen Variablen zu
untersuchen. Dies gilt insbesondere, wenn es sich um einen fremden
Datensatz handelt. Die Namen der Variablen, das heißt der Spalten eines
Datensatzes, können mit der Funktion names()
abgefragt
werden.
names(df)
## [1] "identifikation" "bedingung" "geschlecht" "alter" "wert_t1" "wert_t2"
Mit names()
können wir auch die Variablennamen ändern.
Erscheint uns beispielsweise die Bezeichnung “identifikation” zu lang
und wir einen kürzeren Variablennamen bevorzugen, so können wir diesen
einfach anpassen. Dazu wird die erste Spalte des Dataframes
df
mit den eckigen Klammern []
ausgewählt und
dann geändert.
names(df)[1] <- "id"
df
id | bedingung | geschlecht | alter | wert_t1 | wert_t2 |
---|---|---|---|---|---|
1 | E | M | 17 | 8.0 | 8.3 |
2 | E | M | 19 | 6.0 | 6.4 |
3 | C | W | 22 | 7.5 | 7.7 |
4 | C | M | 18 | 6.8 | 6.3 |
5 | C | W | 16 | 8.0 | 7.5 |
6 | E | W | 21 | 6.4 | 6.4 |
Achten Sie bei der Änderung von Variablennamen darauf, dass diese gut lesbar und für andere verständlich sind. Die Variablennamen sollten jedoch nicht zu lang sein, um unnötigen Schreibaufwand zu vermeiden.
Häufig benötigt man einen Datensatz nicht in seiner Gesamtheit, sondern möchte bestimmte Zeilen oder Spalten oder einzelne Zellen aus einer Matrix oder einem Dataframe auswählen. Innerhalb zweidimensionaler Objekte können einzelne Elemente auf verschiedene Arten ausgewählt werden.
[]
Mit einer Zahl vor dem Komma kann eine Zeile und mit einer Zahl nach
dem Komma eine Spalte in R
ausgewählt werden. Durch diese
Identifikation von Zeilen und Spalten ist es möglich, Elemente innerhalb
von zweidimensionalen Objekten auszugeben. Im Folgenden werden einige
Beispiele für die Auswahl von Elementen gegeben. Diese werden anhand
eines Dataframes gezeigt, können aber analog auch auf Matrizen
angewendet werden.
Dritte Spalte:
df[, 3]
## [1] "M" "M" "W" "M" "W" "W"
Jede Spalte außer der ersten:
df[, -1]
bedingung | geschlecht | alter | wert_t1 | wert_t2 |
---|---|---|---|---|
E | M | 17 | 8.0 | 8.3 |
E | M | 19 | 6.0 | 6.4 |
C | W | 22 | 7.5 | 7.7 |
C | M | 18 | 6.8 | 6.3 |
C | W | 16 | 8.0 | 7.5 |
E | W | 21 | 6.4 | 6.4 |
Die vierte Zeile:
df[4, ]
id | bedingung | geschlecht | alter | wert_t1 | wert_t2 | |
---|---|---|---|---|---|---|
4 | 4 | C | M | 18 | 6.8 | 6.3 |
Die Zelle in der zweiten Reihe und vierten Spalte:
df[2, 5]
## [1] 6
Nur die Variablen Identifikation und Alter:
df[, c(1, 4)]
id | alter |
---|---|
1 | 17 |
2 | 19 |
3 | 22 |
4 | 18 |
5 | 16 |
6 | 21 |
Die letzten drei Beobachtungen:
df[4:6, ]
id | bedingung | geschlecht | alter | wert_t1 | wert_t2 | |
---|---|---|---|---|---|---|
4 | 4 | C | M | 18 | 6.8 | 6.3 |
5 | 5 | C | W | 16 | 8.0 | 7.5 |
6 | 6 | E | W | 21 | 6.4 | 6.4 |
Wenn Zeilen- und Spaltennamen vorliegen, können wir genauso diese Namen zur Indizierung mithilfe der eckigen Klammern verwenden.
df[, c("bedingung", "geschlecht")]
bedingung | geschlecht |
---|---|
E | M |
E | M |
C | W |
C | M |
C | W |
E | W |
$
Für Dataframes empfiehlt sich die Verwendung des Dollarzeichens
$
als Alternative zur Auswahl durch Klammern. Es wird der
Variablenname mit dem Dollarzeichen an den Datensatz angehängt. Für
Matrizen funktioniert dieses Auswahlverfahren allerdings nicht.
df$alter
## [1] 17 19 22 18 16 21
Die Verwendung des Dollarzeichens ist weniger fehleranfällig, da wir
den Namen der ausgewählten Variablen explizit angeben müssen und der
Code weniger komplex ist. RStudio
hilft uns dabei, indem es
automatisch Variablennamen vorschlägt. Außerdem wird unser Code durch
die Angabe der Variablennamen übersichtlicher und verständlicher. Daher
ist die Auswahl über das Dollarzeichen bei Dataframes vorzuziehen.
Neben der Identifikation von Zeilen und Spalten können auch einzelne Werte innerhalb einer Spalte oder Variable ausgewählt werden. Oft ist es von Interesse, für welche Beobachtungen eine Variable einen bestimmten Wert annimmt. Wir können daher bei der Auswahl noch detaillierter vorgehen als oben gezeigt. Und zwar indem wir die Merkmalsausprägungen bei der Auswahl miteinbeziehen. Wenn uns beispielsweise interessiert, welche Teilnehmenden des Experiments der Kontrollgruppe angehören, gehen wir folgendermaßen vor.
Wir bilden einen logischen Vektor, der eine Aussage darüber trifft,
für welche Beobachtungen unter Bedingung ein C
eingetragen
wurde.
df$bedingung == "C"
## [1] FALSE FALSE TRUE TRUE TRUE FALSE
Ergebnis: Die Variable Bedingung nimmt in der ersten, zweiten und
sechsten Zeile den Wert C
an.
Diesen logischen Vektor wenden wir auf den Datensatz df
an indem wir ihn in die eckigen Klammern vor das Komma
schreiben. Also dorthin, wo Information zu den Zeilen abgerufen wird.
Die Anweisung an R
lautet dann: Nenne mir die Zeilen, für
die die Aussage, dass die Variable Bedingung gleich C
ist,
zutrifft.
df[df$bedingung == "C", ]
id | bedingung | geschlecht | alter | wert_t1 | wert_t2 | |
---|---|---|---|---|---|---|
3 | 3 | C | W | 22 | 7.5 | 7.7 |
4 | 4 | C | M | 18 | 6.8 | 6.3 |
5 | 5 | C | W | 16 | 8.0 | 7.5 |
Genauso könnten uns nur die Probanden interessieren, die der
Kontrollgruppe angehören und die einen wert_t1
aufweisen,
der größer als 6,0 ist. Wir formulieren also zwei Bedingungen, die wir
mit einem logischem &
verknüpfen.
df[df$bedingung == "C" & df$wert_t1 > 6.0, ]
id | bedingung | geschlecht | alter | wert_t1 | wert_t2 | |
---|---|---|---|---|---|---|
3 | 3 | C | W | 22 | 7.5 | 7.7 |
4 | 4 | C | M | 18 | 6.8 | 6.3 |
5 | 5 | C | W | 16 | 8.0 | 7.5 |
In diesen Beispielen beziehen wir die Identifikation der Zeilen, die
ausgewählt werden sollen, auf den gesamten Datensatz, da df
vor der eckigen Klammer steht. Wir können die Kennzeichnung aber auch
nur auf einzelne Variablen beziehen. Dies erreichen wir, indem wir vor
die eckigen Klammern zusätzlich einen Variablennamen schreiben. Wenn wir
ein Element einer Variablen auswählen wollen, haben wir es wieder mit
einem eindimensionalen Objekt zu tun. Deshalb gehen wir bei der Auswahl
von Elementen innerhalb von Vektoren genauso vor wie in Sitzung 1. Das
heißt, das Komma in der eckigen Klammer entfällt.
df$geschlecht[df$bedingung == "C"]
## [1] "W" "M" "W"
Die Auswahl von Zeilen, Spalten und Zellen kann nützlich sein, um
Informationen über Variablen zu erhalten oder diese zu transformieren.
Häufig möchten wir jedoch einen Datensatz nach bestimmten
Auswahlkriterien einschränken. Zum Beispiel, wenn wir nur an einem
bestimmten Satz von Variablen oder einem bestimmten
Untersuchungszeitraum für unsere weitere Analyse interessiert sind. In
diesem Fall ist es sinnvoll, einen Teildatensatz, ein Subset, zu
erstellen. Dazu müssen wir zunächst die Elemente, die uns interessieren
auswählen. Im nächsten Schritt müssen wir diese Elemente in einem neuen
Objekt speichern. Die Auswahl der Elemente haben wir bereits behandelt.
Wie wir in der ersten Sitzung gesehen haben, verwenden wir den Operator
<-
, um ein Objekt zu speichern. Dies funktioniert
genauso für Subsets.
Hier ein Beispiel für ein Subset, dass nur die Experimentalgruppe enthält:
subset <- df[df$bedingung == "E", ]
subset
id | bedingung | geschlecht | alter | wert_t1 | wert_t2 | |
---|---|---|---|---|---|---|
1 | 1 | E | M | 17 | 8.0 | 8.3 |
2 | 2 | E | M | 19 | 6.0 | 6.4 |
6 | 6 | E | W | 21 | 6.4 | 6.4 |
subset
ist nun das Objekt, in dem der verkürzte
Datensatz gespeichert wurde. Nun ein weiteres Beipsiel für einen
Teildatensatz der nur die volljährigen Probanden beinhaltet:
subset <- df[df$alter >= 18, ]
subset
id | bedingung | geschlecht | alter | wert_t1 | wert_t2 | |
---|---|---|---|---|---|---|
2 | 2 | E | M | 19 | 6.0 | 6.4 |
3 | 3 | C | W | 22 | 7.5 | 7.7 |
4 | 4 | C | M | 18 | 6.8 | 6.3 |
6 | 6 | E | W | 21 | 6.4 | 6.4 |
Diese Subsets sind durch die inhaltliche Merkmalsausprägung der
Variablen bedingung
und alter
bestimmt.
Natürlich können wir auch einfach einzelne Spalten oder Zeilen
auswählen. Generell ist der Ablauf identisch zur Auswahl von Elemente
aus einem Dataframe. Der einzige Unterschied besteht darin, dass wir
unser Subset in einem neuen Objekt speichern.
Subset, das nur die Variable alter
beinhaltet:
subset <- df$alter
subset
## [1] 17 19 22 18 16 21
Subset der vierten bis zur sechsten Zeile:
subset <- df[4:6, ]
subset
id | bedingung | geschlecht | alter | wert_t1 | wert_t2 | |
---|---|---|---|---|---|---|
4 | 4 | C | M | 18 | 6.8 | 6.3 |
5 | 5 | C | W | 16 | 8.0 | 7.5 |
6 | 6 | E | W | 21 | 6.4 | 6.4 |
Subset der ersten und der dritten Spalte:
subset <- df[, c(1, 3)]
subset
id | geschlecht |
---|---|
1 | M |
2 | M |
3 | W |
4 | M |
5 | W |
6 | W |
Subset der Variablen id
,
geschlecht´, und
alter`:
subset <- df[, c("id", "geschlecht", "alter")]
subset
id | geschlecht | alter |
---|---|---|
1 | M | 17 |
2 | M | 19 |
3 | W | 22 |
4 | M | 18 |
5 | W | 16 |
6 | W | 21 |
subset()
Durch die Funktion subset()
können wir uns das
aufwendige Auswählen der Elemente mittels eckiger Klammern vereinfachen.
subset()
ermöglicht die Reduktion eines Datensatzes auf
ausgewählte Zeilen mit dem Argument subset
und auf
bestimmte Spalten mit dem Argument select
.
Wir erstellen einen verkürzten Datensatz, der nur die Variable
alter
beinhaltet:
sub <- subset(df, select = alter)
sub
alter |
---|
17 |
19 |
22 |
18 |
16 |
21 |
Es wird ein Subset aus den Variablen id
,
geschlecht´ und
alter` erstellt:
sub <- subset(df, select = c(id, geschlecht, alter))
sub
id | geschlecht | alter |
---|---|---|
1 | M | 17 |
2 | M | 19 |
3 | W | 22 |
4 | M | 18 |
5 | W | 16 |
6 | W | 21 |
Hier wird ein neuer Datensatz erstellt, der nur minderjährige
Teilnehmende enthält. Dabei können wir das Argument subset
auch weglassen.
sub <- subset(df, alter < 18)
sub
id | bedingung | geschlecht | alter | wert_t1 | wert_t2 | |
---|---|---|---|---|---|---|
1 | 1 | E | M | 17 | 8 | 8.3 |
5 | 5 | C | W | 16 | 8 | 7.5 |
Das Argument select
erfordert eine Indizierung der
Variablen, während das Argument subset
inhaltliche
Information zu den Merkmalsausprägungen erfordert (z.B. “>= 4”, “<
18”). Unabhängig davon, wie Sie ein Subset erstellen, beachten Sie, dass
Sie ihr Subset niemals unter dem Namen des ursprünglichen Datensatzes
speichern. Dadurch wird der ursprüngliche Datensatz mit dem Subset
überschrieben, was unbedingt zu vermeiden ist.
Abschließend möchten wir mit den Faktoren einen wichtigen eindimensionalen Objekttyp behandeln. Das Besondere an Faktoren ist, dass sie Labels verwenden. Mithilfe von beschreibenden Labels wird unsere Datenanalyse anschaulicher: Eine Variable, welche die Labels “klein”, “mittel” und “groß” verwendet, ist intuitiv verständlicher als eine Variable, die stattdessen nur die numerischen Werte 1, 2 und 3 besitzt. Durch Faktoren erhalten wir eine Beschreibung zu unseren Daten.
Wir erzeugen Faktoren mit der Funktion factor()
. Unser
Faktor x
soll einmal den Wert “klein”, zweimal den Wert
“mittel” und dreimal den Wert “groß” beinhalten. Wir verwenden
c()
und zählen die Werte des Faktors auf.
x <- factor(c("klein", "mittel", "mittel", "groß", "groß", "groß"))
x
## [1] klein mittel mittel groß groß groß
## Levels: groß klein mittel
Nachdem wir x
ausgeben haben, sehen wir im Output, dass
unsere Ausprägungen wie gewünscht erscheinen. Die Levels werden außerdem
noch einmal ausgegeben. Das Besondere an den Faktoren ist, dass sich
hinter den Labels (“klein”, “mittel” und “groß”) numerische Werte
verbergen. Sie ermöglichen mathematische Operationen, die mit den Labels
selbst nicht möglich wären. Die zugrundeliegenden numerischen Werte
können wir uns mithilfe von unclass(x)
ausgeben lassen.
unclass(x)
## [1] 2 3 3 1 1 1
## attr(,"levels")
## [1] "groß" "klein" "mittel"
x
## [1] klein mittel mittel groß groß groß
## Levels: groß klein mittel
Vergleicht man die Ausgabe von unclass(x)
und
x
vergleichen, so stellt man fest, dass “klein” den Wert 2,
“mittel” den Wert 3 und “groß” den Wert 1 erhalten hat. Dies liegt
daran, dass R
sich bei der Zuweisung der Werte an der
alphabetischen Reihenfolge orientiert. Demnach kommt zuerst G, dann M
und dann K, was einer inhaltlich sinnvollen Ordnung unserer Levels
widerspricht. Deshalb ordnen wir x
nun so an, dass “klein”
< “mittel” < “groß” ist. Dazu verwenden wir das Argument
levels =
innerhalb der Funktion factor()
und
geben dort mit der Funktion c()
die Level in der richtigen
Reihenfolge an.
x <- factor(c("klein", "mittel", "mittel", "groß", "groß", "groß"),
levels = c("klein", "mittel", "groß"))
unclass(x)
## [1] 1 2 2 3 3 3
## attr(,"levels")
## [1] "klein" "mittel" "groß"
x
## [1] klein mittel mittel groß groß groß
## Levels: klein mittel groß
Jetzt sind Label und Wert sinnvoll zu geordnet. Da Dataframes
Variablen unterschiedlicher Klassen enthalten können, können Variablen
auch als Faktoren vorliegen. Mit as.factor()
können wir
Vektoren zu Faktoren umwandeln. Das gilt auch für Variablen in von
Dataframes. Innerhalb des Dataframes df
ist das nur für die
character-Variablen bedingung
und
geschlecht
sinnvoll, da deren Inhalt als Labels
interpretiert werden kann.
df$geschlecht <- as.factor(df$geschlecht)
df$geschlecht
## [1] M M W M W W
## Levels: M W
unclass(df$geschlecht)
## [1] 1 1 2 1 2 2
## attr(,"levels")
## [1] "M" "W"
df
id | bedingung | geschlecht | alter | wert_t1 | wert_t2 |
---|---|---|---|---|---|
1 | E | M | 17 | 8.0 | 8.3 |
2 | E | M | 19 | 6.0 | 6.4 |
3 | C | W | 22 | 7.5 | 7.7 |
4 | C | M | 18 | 6.8 | 6.3 |
5 | C | W | 16 | 8.0 | 7.5 |
6 | E | W | 21 | 6.4 | 6.4 |
sum()
).table()
und die
summary()
des Faktors ausgeben.table()
und die summary()
des Vektors
ausgeben. Was hat sich im Output dieser Funktionen verändert?