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
pi <- 3.14159265359
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()
dd1 <- c(1,2,3,2,1)
# .. a vector of characters
dd2 <- c('a', 'b', 'c', 'b', 'a')
# a vector of heterogeneous elements - a list
dd3 <- c(1,2,3,2,1, 'a', 'b', 'c', 'b', 'a')
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
dd4 <- list(1, dd1, 'b', dd3, TRUE)
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
dd4[2]
## [[1]]
## [1] 1 2 3 2 1
# a 3-dimensional array, dimensions specified by the second parameter
dd5 <- array(1:12, c(2, 3, 2))
dim(dd5)
## [1] 2 3 2
dd5[1,2,2]
## [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
dd <- c('f', 'm', 'm', 'm', 'f', 'm', 'f', 'd', 'f', 'm')
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
dd.f <- factor(dd)
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
dd.f2 <- factor(dd, levels = c('f', 'm', 'd'))
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.

dd <- data.frame(
    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