Chapter 3 Data Structure and Data Types
3.1 Allgemeines
R kennt eigentlich nur eine Datenstruktur: den Vektor.
Elemente eines Vektors können gleichartig sein (atomic, homogeneous) oder verschiedenartig (heterogeneous). Vektoren mit verschiedenartigen Elementen sind Listen.
Die häufig übliche zweidimensionale Datenstruktur mit Beobachtungen in den Zeilen und Variablen in den Spalten sind in R eigentlich spezialisierte Listen: Dataframes.
Eine sauberere Implementierung von Dataframes sind Tibbles, ein Konzept aus dem tidyverse.
Begründung in vignette("tibble")
.
Eine Matrix ist in R eine Datenstruktur, die zweidimensional und homogen ist, also gleichartige Elemente enthält, meist Zahlen.
Eine Datenstruktur mit mehr als zwei Dimensionen heißt in R ein Array. Arrays enthalten homogene Elemente.
3.1.1 Beispiele
# a scalar is a vector with one element
<- 3.14159265359
pi pi
## [1] 3.141593
# circumference of a circle with radius 3: 2 * pi * radius
2 * pi * 3
## [1] 18.84956
# we generate a vector of numbers using c() which can be read as combine()
<- c(1,2,3,2,1)
dd1 # .. a vector of characters
<- c('a', 'b', 'c', 'b', 'a')
dd2 # a vector of heterogeneous elements - a list
<- c(1,2,3,2,1, 'a', 'b', 'c', 'b', 'a')
dd3 dd3
## [1] "1" "2" "3" "2" "1" "a" "b" "c" "b" "a"
# a lists elements can also be vectors or lists, boolean variables are also possible
<- list(1, dd1, 'b', dd3, TRUE)
dd4 dd4
## [[1]]
## [1] 1
##
## [[2]]
## [1] 1 2 3 2 1
##
## [[3]]
## [1] "b"
##
## [[4]]
## [1] "1" "2" "3" "2" "1" "a" "b" "c" "b" "a"
##
## [[5]]
## [1] TRUE
2] dd4[
## [[1]]
## [1] 1 2 3 2 1
# a 3-dimensional array, dimensions specified by the second parameter
<- array(1:12, c(2, 3, 2))
dd5 dim(dd5)
## [1] 2 3 2
1,2,2] dd5[
## [1] 9
# we leave a neat environment
rm(pi, dd1, dd2, dd3, dd4, dd5)
3.2 Konzeptuelles
R kann mit vielen verschiedenen Datenobjekten zugleich umgehen. Alle zu einem Zeitpunkt bekannten Daten(-objekte) sind im “Global Environment” zu finden (RStudio oben rechts “Environment”).
Die Daten können als Gesamtheit gespeichert und geladen werden (.RData). Siehe hierzu @ref(data_io)
3.3 Faktoren
Faktoren sind Daten-Vektoren, deren Elemente nur wenige Ausprägungen haben.
Normalerweise dienen sie dazu, einzelne Beobachtungen Untergruppen zuzuordnen.
Der Befehl levels()
gibt die unterschiedlichen Ausprägungen der Elemente zurück.
Faktor-Levels haben eine Reihenfolge, Default ist alphabetisch.
Kategoriale Erklärvariablen sind normalerweise vom Typ Factor und kodieren Subgruppen-Zugehörigkeiten
und sind zentral bei sog. varianzanalytischen Designs.
3.3.1 Beispiele
# a vector of characters, might be gender of 10 observations
<- c('f', 'm', 'm', 'm', 'f', 'm', 'f', 'd', 'f', 'm')
dd typeof(dd)
## [1] "character"
# levels does not make sense with a vector of characters
levels(dd)
## NULL
# we convert dd to a vector of type factor
<- factor(dd)
dd.f levels(dd.f)
## [1] "d" "f" "m"
# calling a vector of type factor also returns the levels
dd.f
## [1] f m m m f m f d f m
## Levels: d f m
# we could also set the sequence of levels
<- factor(dd, levels = c('f', 'm', 'd'))
dd.f2 dd.f2
## [1] f m m m f m f d f m
## Levels: f m d
# we clean the Environment
rm(dd, dd.f, dd.f2)
3.4 Attribute von Daten
Datenobjekte können Attribute haben, wie alle Objekte in R. Attribute sind Metainformationen zu den Objekten. Das bekannteste Attribut ist der Name eines Objekts oder seiner Teile. Wir können Attribute benutzen, um Metainformationen zu Objekten mit ihnen zu speichern.
<- data.frame(
dd subj = c(1:10),
gender = c('f', 'm', 'm', 'm', 'f', 'm', 'f', 'd', 'f', 'm'),
qual = c(101, 109, 98, 95, 112, 96, 103, 107, 95, 97)
)str(dd)
## 'data.frame': 10 obs. of 3 variables:
## $ subj : int 1 2 3 4 5 6 7 8 9 10
## $ gender: chr "f" "m" "m" "m" ...
## $ qual : num 101 109 98 95 112 96 103 107 95 97
attributes(dd)
## $names
## [1] "subj" "gender" "qual"
##
## $class
## [1] "data.frame"
##
## $row.names
## [1] 1 2 3 4 5 6 7 8 9 10
# we add attributes
attr(dd, "source") <- "Some random data generated simply to demonstrate data structures"
attr(dd, "author") <- "PZ"
attr(dd, "sequence") <- c(10, 7, 9, 3, 4, 2, 1, 5, 8, 6)
attributes(dd)
## $names
## [1] "subj" "gender" "qual"
##
## $class
## [1] "data.frame"
##
## $row.names
## [1] 1 2 3 4 5 6 7 8 9 10
##
## $source
## [1] "Some random data generated simply to demonstrate data structures"
##
## $author
## [1] "PZ"
##
## $sequence
## [1] 10 7 9 3 4 2 1 5 8 6
attributes(dd)['sequence']
## $sequence
## [1] 10 7 9 3 4 2 1 5 8 6
attributes(dd)$sequence[5:7]
## [1] 4 2 1
3.5 Referenzen
- Mehr zu Daten-Import und Export, auch einzelner Datenobjekte, findet sich in @ref(data_io)
- Advanced R zu Datenstrukturen http://adv-r.had.co.nz/Data-structures.html.