Capítulo17 Tibbles

Fecha de la última revisión

## [1] "2026-08-01"

El tema proviene de los siguientes sitios.

English: https://r4ds.had.co.nz/tibbles.html

Español: https://es.r4ds.hadley.nz/10-tibble.html


17.1 Temas: El paquete Tibble

Los tibble son la versión moderna del data.frame dentro del tidyverse: hacen menos «magia» automática (no cambian nombres ni tipos de columna) y ofrecen una impresión más legible en la consola.

  • as_tibble()

17.2 Crear un tibble

tibble(), tribble(), as_tibble() — crear tablas modernas.

  • tibble(col = valores, ...): crea un tibble por columnas.
  • tribble(~col1, ~col2, v, v, ...): lo crea fila por fila (cómodo para tablas pequeñas escritas a mano).
  • as_tibble(df): convierte un data.frame en tibble.
  • tibble()

Crear un tibble con la siguiente información. Una columna que tiene los valores del 1 al 8 que se llama “secuencia”, una segunda columna que tiene los siguientes valores 23,26, 24,26,27, 11,20,21 que se llama edad y una tercera columna con la siguiente información, Jose, Maria, Carol, Moncho, Liz, Maria, Jorge, Miguel, que se llama Nombre

library(tidyverse)
#library(datos)

tibble(
  secuencia = c(1:6),
  edad = c(23,26, 24,26,27, NA),
  nombre = c("Jose", "Maria", "Carol", "Moncho", "Liz", "Maria")
)
## # A tibble: 6 × 3
##   secuencia  edad nombre
##       <int> <dbl> <chr> 
## 1         1    23 Jose  
## 2         2    26 Maria 
## 3         3    24 Carol 
## 4         4    26 Moncho
## 5         5    27 Liz   
## 6         6    NA Maria

17.3 Crear un tribble

  • tribble()

Haga un tribble con las primeras 3 líneas del tibble anterior

tribble(
  ~secuencia, ~edad, ~nombre,
  1, 23, "Jose",
  2, 26, "Maria",
  3, 23, "Carol"
  
  
)
## # A tibble: 3 × 3
##   secuencia  edad nombre
##       <dbl> <dbl> <chr> 
## 1         1    23 Jose  
## 2         2    26 Maria 
## 3         3    23 Carol

17.4 tibble vs. data.frame

tb = tibble(
  a = lubridate::now() + runif(1e2) * 86400,
  b = lubridate::today() + runif(1e2) * 30,
  c = 1:100,
  d = runif(1e2),
  e = sample(letters, 1e2, replace = TRUE)
)
tb
## # A tibble: 100 × 5
##    a                   b              c      d e    
##    <dttm>              <date>     <int>  <dbl> <chr>
##  1 2026-08-02 00:17:52 2026-08-19     1 0.559  o    
##  2 2026-08-02 06:47:06 2026-08-01     2 0.250  o    
##  3 2026-08-02 01:40:43 2026-08-03     3 0.0653 d    
##  4 2026-08-02 23:26:57 2026-08-02     4 0.573  v    
##  5 2026-08-02 06:59:13 2026-08-23     5 0.651  k    
##  6 2026-08-02 15:11:02 2026-08-12     6 0.581  p    
##  7 2026-08-02 19:49:07 2026-08-25     7 0.0175 x    
##  8 2026-08-02 18:49:06 2026-08-12     8 0.0133 f    
##  9 2026-08-02 13:03:50 2026-08-15     9 0.661  c    
## 10 2026-08-02 19:12:03 2026-08-24    10 0.380  y    
## # ℹ 90 more rows
df_tb=as.data.frame(tb)
df_tb
##                       a          b   c          d e
## 1   2026-08-02 00:17:52 2026-08-19   1 0.55895788 o
## 2   2026-08-02 06:47:06 2026-08-01   2 0.24952694 o
## 3   2026-08-02 01:40:43 2026-08-03   3 0.06531608 d
## 4   2026-08-02 23:26:57 2026-08-02   4 0.57306761 v
## 5   2026-08-02 06:59:13 2026-08-23   5 0.65098699 k
## 6   2026-08-02 15:11:02 2026-08-12   6 0.58124937 p
## 7   2026-08-02 19:49:07 2026-08-25   7 0.01748210 x
## 8   2026-08-02 18:49:06 2026-08-12   8 0.01331984 f
## 9   2026-08-02 13:03:50 2026-08-15   9 0.66064715 c
## 10  2026-08-02 19:12:03 2026-08-24  10 0.38021846 y
## 11  2026-08-02 23:21:19 2026-08-23  11 0.55374044 o
## 12  2026-08-02 20:48:53 2026-08-12  12 0.57734132 r
## 13  2026-08-02 21:13:33 2026-08-03  13 0.89874595 s
## 14  2026-08-02 15:33:34 2026-08-14  14 0.02335350 s
## 15  2026-08-02 10:12:42 2026-08-24  15 0.36233644 a
## 16  2026-08-02 11:57:48 2026-08-08  16 0.79219053 c
## 17  2026-08-02 13:15:40 2026-08-08  17 0.79451792 q
## 18  2026-08-02 01:09:09 2026-08-11  18 0.03461087 h
## 19  2026-08-02 05:47:21 2026-08-02  19 0.83758986 y
## 20  2026-08-02 12:02:40 2026-08-12  20 0.08880666 h
## 21  2026-08-02 04:22:51 2026-08-14  21 0.81779321 m
## 22  2026-08-02 02:47:14 2026-08-28  22 0.88725936 k
## 23  2026-08-02 15:41:35 2026-08-02  23 0.26002925 a
## 24  2026-08-02 02:52:18 2026-08-12  24 0.31542900 t
## 25  2026-08-02 09:29:21 2026-08-06  25 0.91124396 m
## 26  2026-08-02 04:49:11 2026-08-15  26 0.69990520 u
## 27  2026-08-02 14:00:19 2026-08-30  27 0.83810166 o
## 28  2026-08-02 11:30:15 2026-08-04  28 0.39910988 q
## 29  2026-08-02 21:25:00 2026-08-24  29 0.99993174 t
## 30  2026-08-02 13:08:00 2026-08-10  30 0.66218230 y
## 31  2026-08-02 08:05:49 2026-08-05  31 0.98046836 c
## 32  2026-08-02 12:15:40 2026-08-13  32 0.13905381 o
## 33  2026-08-02 16:17:35 2026-08-27  33 0.34755612 m
## 34  2026-08-02 05:12:12 2026-08-20  34 0.99072892 t
## 35  2026-08-02 20:25:34 2026-08-23  35 0.01158322 g
## 36  2026-08-02 10:39:23 2026-08-21  36 0.59905566 w
## 37  2026-08-02 08:40:36 2026-08-21  37 0.66253655 m
## 38  2026-08-02 19:59:56 2026-08-09  38 0.81108752 p
## 39  2026-08-02 03:39:18 2026-08-28  39 0.86941914 m
## 40  2026-08-02 13:24:55 2026-08-25  40 0.18531162 v
## 41  2026-08-02 21:13:22 2026-08-05  41 0.93845374 p
## 42  2026-08-02 01:43:32 2026-08-11  42 0.98626153 o
## 43  2026-08-02 01:40:29 2026-08-24  43 0.36978729 g
## 44  2026-08-02 01:28:25 2026-08-12  44 0.40597546 h
## 45  2026-08-01 23:53:00 2026-08-03  45 0.45127090 p
## 46  2026-08-02 16:28:59 2026-08-05  46 0.83761479 d
## 47  2026-08-02 13:21:11 2026-08-30  47 0.20941751 c
## 48  2026-08-02 09:12:52 2026-08-26  48 0.99204004 y
## 49  2026-08-02 09:30:27 2026-08-02  49 0.50421065 r
## 50  2026-08-02 03:05:08 2026-08-12  50 0.33143023 g
## 51  2026-08-02 22:28:44 2026-08-11  51 0.73076078 w
## 52  2026-08-02 13:24:35 2026-08-07  52 0.46601006 v
## 53  2026-08-02 09:53:45 2026-08-21  53 0.93914242 z
## 54  2026-08-02 14:47:52 2026-08-27  54 0.88173091 s
## 55  2026-08-02 07:46:36 2026-08-25  55 0.34532379 i
## 56  2026-08-02 01:49:31 2026-08-19  56 0.58456342 l
## 57  2026-08-01 23:51:36 2026-08-27  57 0.88058255 v
## 58  2026-08-02 01:44:21 2026-08-02  58 0.22127013 v
## 59  2026-08-02 15:24:58 2026-08-19  59 0.89288290 o
## 60  2026-08-02 07:32:31 2026-08-07  60 0.02081485 y
## 61  2026-08-02 04:10:17 2026-08-17  61 0.27143203 n
## 62  2026-08-02 09:07:44 2026-08-08  62 0.95400736 c
## 63  2026-08-02 07:14:31 2026-08-09  63 0.86419811 j
## 64  2026-08-02 08:08:58 2026-08-10  64 0.25909042 i
## 65  2026-08-02 16:07:01 2026-08-11  65 0.71488890 t
## 66  2026-08-02 16:38:54 2026-08-10  66 0.14559841 m
## 67  2026-08-02 13:45:48 2026-08-15  67 0.33884110 a
## 68  2026-08-02 17:11:36 2026-08-14  68 0.85914380 c
## 69  2026-08-02 14:15:06 2026-08-22  69 0.78041364 o
## 70  2026-08-02 08:52:12 2026-08-21  70 0.83340269 v
## 71  2026-08-02 19:42:01 2026-08-22  71 0.46138001 k
## 72  2026-08-02 18:59:11 2026-08-23  72 0.95366063 x
## 73  2026-08-02 05:36:59 2026-08-28  73 0.58594067 i
## 74  2026-08-02 07:46:48 2026-08-17  74 0.07427914 i
## 75  2026-08-02 00:06:09 2026-08-29  75 0.41196391 p
## 76  2026-08-02 21:14:11 2026-08-11  76 0.64245513 l
## 77  2026-08-02 09:20:50 2026-08-14  77 0.88572561 a
## 78  2026-08-02 03:52:16 2026-08-30  78 0.27894255 z
## 79  2026-08-02 09:46:24 2026-08-21  79 0.11545121 p
## 80  2026-08-02 00:50:02 2026-08-27  80 0.27069348 w
## 81  2026-08-02 14:35:47 2026-08-02  81 0.09039557 m
## 82  2026-08-02 13:48:11 2026-08-30  82 0.84375956 u
## 83  2026-08-02 05:15:26 2026-08-13  83 0.44452948 t
## 84  2026-08-02 03:35:36 2026-08-09  84 0.17054338 a
## 85  2026-08-02 09:36:33 2026-08-30  85 0.94064577 n
## 86  2026-08-02 12:04:12 2026-08-06  86 0.55504992 s
## 87  2026-08-02 03:17:24 2026-08-29  87 0.74138904 o
## 88  2026-08-02 02:59:54 2026-08-12  88 0.69146950 m
## 89  2026-08-02 15:07:51 2026-08-23  89 0.95055655 v
## 90  2026-08-02 19:03:30 2026-08-27  90 0.50241356 h
## 91  2026-08-02 19:23:08 2026-08-26  91 0.94041471 l
## 92  2026-08-02 13:27:02 2026-08-12  92 0.66040567 e
## 93  2026-08-02 07:19:09 2026-08-17  93 0.74075930 s
## 94  2026-08-02 18:54:20 2026-08-17  94 0.49824345 q
## 95  2026-08-01 23:33:28 2026-08-29  95 0.10436335 j
## 96  2026-08-02 08:32:00 2026-08-01  96 0.06179632 g
## 97  2026-08-02 11:34:37 2026-08-10  97 0.21776393 s
## 98  2026-08-02 22:54:24 2026-08-01  98 0.15662152 x
## 99  2026-08-02 09:37:53 2026-08-19  99 0.62424786 s
## 100 2026-08-02 14:35:09 2026-08-03 100 0.39037936 c
tb %>%
  print(n = 4, width = Inf)
## # A tibble: 100 × 5
##   a                   b              c      d e    
##   <dttm>              <date>     <int>  <dbl> <chr>
## 1 2026-08-02 00:17:52 2026-08-19     1 0.559  o    
## 2 2026-08-02 06:47:06 2026-08-01     2 0.250  o    
## 3 2026-08-02 01:40:43 2026-08-03     3 0.0653 d    
## 4 2026-08-02 23:26:57 2026-08-02     4 0.573  v    
## # ℹ 96 more rows
lubridate::now()
## [1] "2026-08-01 23:30:10 AST"
lubridate::today()
## [1] "2026-08-01"
  • To convert a data frame to a tibble use as_tibble()

  • To convert a tibble to a data frame use as.data.frame


17.5 Diferencias entre un tibble y un data frame.

  • Tibbles tiene un buen método de impresión que muestra solo las primeras 10 filas y todas las columnas que caben en la pantalla.
  • Tibbles no admite nombres de filas. Se eliminan al convertir a tibble o al crear subconjuntos:

Operaciones aritméticas en tibbles

A diferencia de los data frame, los tibbles NO admiten operaciones aritméticas en todas las columnas. El resultado  fuerza silenciosamente a un data frame.

tbl <- tibble(a = 1:3, b = 4:6)
result=tbl * 2

is_tibble(result)
## [1] FALSE
is.data.frame(result)
## [1] TRUE
result2=tbl |> mutate(c=b*2)
result2
## # A tibble: 3 × 3
##       a     b     c
##   <int> <int> <dbl>
## 1     1     4     8
## 2     2     5    10
## 3     3     6    12
is_tibble(result2)
## [1] TRUE
  • Los tibbles también son más estrictos con $. Tibbles nunca realiza coincidencias parciales y generará una advertencia y devolverá NULL si la columna no existe:
df <- data.frame(abc = 1)
df$a
## [1] 1
#> [1] 1

df2 <- tibble(abc = 1)
df2$abc # nota el error
## [1] 1
  • Para extraer una columna de un tibble, use [[. Esto es más seguro que $ porque nunca realiza coincidencias parciales:

17.6 Selección de subconjuntos de datos

library(datos)

head(vuelos$salida_programada, n=20) 
##  [1] 515 529 540 545 600 558 600 600 600 600 600 600 600 600 600 559 600 600 600
## [20] 600
vuelos[["salida_programada"]] |> head(n=20)
##  [1] 515 529 540 545 600 558 600 600 600 600 600 600 600 600 600 559 600 600 600
## [20] 600
#Alternativas usar esta función dentro de pipe

vuelos %>% .$salida_programada |> head(n=20)
##  [1] 515 529 540 545 600 558 600 600 600 600 600 600 600 600 600 559 600 600 600
## [20] 600
vuelos %>% .[["salida_programada"]] |> head(n=20)
##  [1] 515 529 540 545 600 558 600 600 600 600 600 600 600 600 600 559 600 600 600
## [20] 600
vuelos %>% .[["atraso_salida"]] |> 
  head(n=20)
##  [1]  2  4  2 -1 -6 -4 -5 -3 -3 -2 -2 -2 -2 -2 -1  0 -1  0  0  1
  1. Ejercicios:

Hacer los ejercicios en la sección 10.5 del libro en español