10  Tibbles

In diesem Kapitel geht es um das Paket tibble, das Teil des Tidyverses ist. Die Vignette hilft einen Überblick über Tibbles zu bekommen.

vignette("tibble")

Beispiele

as_tibble(LETTERS)       # letters bzw. LETTERS sind Vektoren
# A tibble: 26 × 1
   value
   <chr>
 1 A    
 2 B    
 3 C    
 4 D    
 5 E    
 6 F    
 7 G    
 8 H    
 9 I    
10 J    
# ℹ 16 more rows
as_tibble(iris)          # iris ist ein Data Frame  
# A tibble: 150 × 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
 1          5.1         3.5          1.4         0.2 setosa 
 2          4.9         3            1.4         0.2 setosa 
 3          4.7         3.2          1.3         0.2 setosa 
 4          4.6         3.1          1.5         0.2 setosa 
 5          5           3.6          1.4         0.2 setosa 
 6          5.4         3.9          1.7         0.4 setosa 
 7          4.6         3.4          1.4         0.3 setosa 
 8          5           3.4          1.5         0.2 setosa 
 9          4.4         2.9          1.4         0.2 setosa 
10          4.9         3.1          1.5         0.1 setosa 
# ℹ 140 more rows
as_tibble(UCBAdmissions) # UCBAdmissions ist ein 3-dimensionales Array
# A tibble: 24 × 4
   Admit    Gender Dept      n
   <chr>    <chr>  <chr> <dbl>
 1 Admitted Male   A       512
 2 Rejected Male   A       313
 3 Admitted Female A        89
 4 Rejected Female A        19
 5 Admitted Male   B       353
 6 Rejected Male   B       207
 7 Admitted Female B        17
 8 Rejected Female B         8
 9 Admitted Male   C       120
10 Rejected Male   C       205
# ℹ 14 more rows

10.1 Erstellen von Tibbles

Man kann Tibbles mit der Funktion tibble() aus einzelnen Vektoren erstellen. Dies geschieht analog zu den Data Frames, die auf die gleiche Weise mit data.frame() erzeugt werden.

  • Vektoren der Länge 1 werden automatisch recycled.

  • Zeichenketten bleiben Zeichenketten und werden nicht zu Faktoren konvertiert, es werden keine Zeilennamen vergeben und Merkmalnamen werden nicht geändert (dies ist bei data.frame() anders).

  • Es ist möglich nicht-syntaktische Namen zu vergeben, die keine gültigen R-Variablennamen sind. Diese müssen in Backticks (`) (Bemerkung: auf Deutsch heißt der Akzent rückwärts geneigtes Hochkomma, was eher sperrig ist, oder der Gravis, was aber keiner kennt.) gesetzt werden. Beim Aufruf der Merkmale (z.B. bei Funktionen aus dem ggplot2-Paket oder dem dplyr-Paket) müssen die Backticks auch gesetzt werden. Man sollte im Allgemeinen aber davon absehen solche Merkmalsnamen zu verwenden.

Beispiele

tibble(u = 1:4, 
       v = 1, 
       w = u^2 + v, 
       x = LETTERS[1:4]
)
# A tibble: 4 × 4
      u     v     w x    
  <int> <dbl> <dbl> <chr>
1     1     1     2 A    
2     2     1     5 B    
3     3     1    10 C    
4     4     1    17 D    
tb <- tibble(
  `:)`   = "smile", 
  ` `    = "space",
  `2000` = "number"
)
tb
# A tibble: 1 × 3
  `:)`  ` `   `2000`
  <chr> <chr> <chr> 
1 smile space number

10.2 Tribbles

  • Tribble steht für transposed tibble, weil die Daten zeilen- statt spaltenweise angegeben werden.

  • Tribbles werden mit der Funktion tribble() erzeugt und sind dafür geeignet direkt in R Datentabellen einzugeben.

  • Die Merkmalnamen werden als Formel, das heißt beginnend mit einer Tilde, angegeben. Diese geben vor, wie viele Spalten der entstehenden Tibble haben wird.

  • Ein Vorteil ist offenbar, dass es sehr einfach ist, ein neue Zeile hinzuzufügen – auch in der Mitte des Tibbles. Dies ist bei Tibbles, bei denen man jedes Merkmal (also die Spalte) als Vektor eingibt, schwieriger.

  • Die Zeile #--|--|---- ist ein Kommentar und dient dazu, die Überschrift hervorzuheben.

  • Fun fact: Tribbles

tribble(
  ~x, ~y, ~z,
  #--|--|----# 
  "a", 2, 3.6,
  "b", 1, 8.5,
)
# A tibble: 2 × 3
  x         y     z
  <chr> <dbl> <dbl>
1 a         2   3.6
2 b         1   8.5
tribble(
   ~x, ~y, ~z,    # y integer
   "a", 2L, 3.6,
   "b", 1L, 8.5,
)
# A tibble: 2 × 3
  x         y     z
  <chr> <int> <dbl>
1 a         2   3.6
2 b         1   8.5

10.3 Ausgabe von Tibbles und Data Frames

Im Wesentlichen gibt es zwei große Unterschiede zwischen Tibbles und Data Frames: die Darstellung und das Extrahieren eines Merkmals.

  • Ruft man einen Tibble auf, so werden die ersten 10 Zeilen dargestellt, sowie alle Merkmale, die auf den Bildschirm passen. Ferner sieht man unterhalb der Merkmalnamen, um was für einen Datentyp es sich bei dem jeweiligen Merkmal handelt. Die Darstellung von Data Frames ist vor allem bei großen Datensätzen wesentlich unübersichtlicher.

  • Mit der Funktion print() kann sowohl die Anzahl der Ausprägungen (n=) als auch die Breite (width=) der Ausgabe kontrolliert werden. Mit der Option width=Inf werden alle Merkmale dargestellt.

library(pacman)
p_load(nycflights13)

flights |>  print(n=4, width = 80)
# A tibble: 336,776 × 19
   year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
  <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
1  2013     1     1      517            515         2      830            819
2  2013     1     1      533            529         4      850            830
3  2013     1     1      542            540         2      923            850
4  2013     1     1      544            545        -1     1004           1022
# ℹ 336,772 more rows
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
#   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>

Es ist darauf zu achten, dass die Breite nicht in Anzahl der Spalten, sondern in Anzahl der Zeichen angegeben wird.

  • Eine weitere Möglichkeit zur Darstellung ist die Funktion View(), die einen Tab mit Scrollbars im Editor öffnet und dort den gesamten Datensatz anzeigt.

10.3.1 Steuerung der Ausgabe von Tibbles mit options()

Mit der Funktion options() können R neue Standard-Einstellungen übergeben werden.

  • Für die Darstellung von Tibbles gibt es diese beiden Möglichkeiten:
options(tibble.print_max = n, 
        tibble.print_min = m)
  • falls der Tibble mehr als n Zeilen hat, zeige nur m Zeilen.
  • Falls immer alle Zeilen gezeigt werden soll, verwendet man
options(tibble.print_min = Inf) 
options(tibble.width = Inf)

zeigt immer alle Spalten, unabhängig von der Breite des Bildschirms.

  • Ein paar weitere praktische Optionen (es gibt noch sehr viel mehr!) sind:
Option Typ Standard Bedeutung
digits int 7 Anzahl der zählenden Ziffern, die bei der Ausgabe von Zahlen dargestellt werden. Möglich sind ganze Zahlen zwischen 1 und 22.
max.print int 99999 Maximale Länge der Ausgabe bei der Darstellung von Vektoren, Listen oder Datentabellen (Data Frames, keine Tibbles).
OutDec chr "." Dezimaltrenner bei der Ausgabe.
scipen int 0 Bestrafungsterm für die Wahl, ob Zahlen in exponentieller Schreibweise geschrieben werden sollen oder nicht (7e4 vs. 70000). Positive Zahlen geben eine Tendenz zu nicht-exponentieller Schreibweise.
pi 
[1] 3.141593
options(digits = 22) 
pi
[1] 3.141592653589793115998

10.4 Extrahieren eines Merkmals aus einem Tibble

  • Um auf einzelne Merkmale eines Tibbles als Vektor zuzugreifen, gibt es mehrere Möglichkeiten:
    • Name des Merkmals ($NameMerkmal oder [["NameMerkmal"]])
    • Position des Merkmals ([[PositionMerkmal]]).
  • Die Funktion pull() aus dem Paket dplyr macht das Gleiche und kann ein Merkmal sowohl über den Namen als auch die Position extrahieren.
    • Verwendet man die Pipe, muss man für $ bzw. [[ ]] einen Platzhalter verwenden.
# Die Beispiele werden zu

df |> .$x
df |> .[["x"]]
df |> pull(x)   # kein Platzhalter!
Achtung:
  • Die Funktion select() liefert wieder einen Tibble (und keinen Vektor!), auch wenn nur ein Merkmal ausgewählt wurde.

  • Bei Data Frames geschieht die Auswahl von einem oder mehreren Merkmalen über die obige $-Notation, die Indexselektion [, ]) oder über subset().

(df <- tibble(x = runif(5), y = rnorm(5)))
# A tibble: 5 × 2
      x      y
  <dbl>  <dbl>
1 0.561 -0.992
2 0.298 -0.986
3 0.642  0.676
4 0.128 -2.13 
5 0.292  0.481
# Subsetting mittels Name:
df$x
[1] 0.5608 0.2983 0.6424 0.1285 0.2918
df[["x"]]
[1] 0.5608 0.2983 0.6424 0.1285 0.2918
pull(df, x)
[1] 0.5608 0.2983 0.6424 0.1285 0.2918
# Subsetting mittels Position:
df[[1]]
[1] 0.5608 0.2983 0.6424 0.1285 0.2918
pull(df, 1)
[1] 0.5608 0.2983 0.6424 0.1285 0.2918