Capítulo17 Tibbles

Fecha de la última revisión

## [1] "2026-09-09"

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.

  • Por qué existe el tibble
  • Crear tablas: tibble(), tribble(), as_tibble()
  • Cómo se imprime un tibble, y cómo pedirle que imprima más
  • Las cuatro diferencias con el data.frame que de verdad importan
  • Sacar una columna: $, [[, [ y el marcador .
  • Cuándo hay que volver a un data.frame

17.2 ¿Por qué existe el tibble?

El data.frame es de 1990 y se diseñó cuando las tablas cabían en una pantalla. Con los años se le fueron acumulando comportamientos que en su momento eran cómodos y que hoy hacen perder tiempo:

  • imprime la tabla entera en la consola, así que un archivo de 50 000 filas llena la pantalla y hay que subir a buscar el principio;
  • hace coincidencia parcial de nombres: si le pides df$a y la única columna que empieza por “a” es abc, te la da sin avisar, y una errata pasa por buena;
  • durante muchos años convertía el texto en factores por su cuenta, y arreglaba los nombres de columna sin decirlo;
  • guarda nombres de fila, que son datos escondidos fuera de las columnas.

El tibble hace lo mismo que el data.frame pero sin la magia: imprime poco, no adivina nombres, no cambia tipos y no guarda nombres de fila. Se queja cuando hay algo raro en vez de arreglarlo en silencio, y eso es exactamente lo que uno quiere de una herramienta de análisis.

Un tibble es un data frame: is.data.frame(mi_tibble) devuelve TRUE. Todo lo que funciona con un data frame funciona con un tibble. Al revés no siempre, y de eso trata la última sección del capítulo.

  • as_tibble()

17.3 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()

tibble() construye la tabla por columnas: cada argumento es un vector, y todos tienen que tener el mismo largo (o largo 1, que se repite). A diferencia de data.frame(), no toca los nombres, no convierte el texto en factores y no recicla vectores de largo raro.

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

El bloque de abajo construye solo las seis primeras filas de las ocho que pide el enunciado, y deja un NA en la última edad. Completarlo es el primer ejercicio del capítulo.

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.4 Crear un tribble

tribble() construye la tabla fila por fila, que es como uno la escribiría a mano en una libreta. Los nombres de las columnas van con una virgulilla delante (~secuencia), y después vienen los valores en el mismo orden. Es la forma más cómoda de meter en un script una tabla pequeña: los datos de un experimento, una tabla de equivalencias, los códigos de las parcelas.

Alinea los valores en columnas cuando escribas un tribble(). No cambia nada para R, pero hace que un dato fuera de sitio salte a la vista.

  • 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.5 tibble vs. data.frame

Los dos bloques siguientes construyen la misma tabla de 100 filas y la imprimen de las dos maneras. Compara la salida: el tibble enseña diez filas, el tipo de cada columna debajo del nombre (<dttm>, <date>, <int>, <dbl>, <chr>) y una nota de cuántas filas quedaron sin imprimir. El data frame las suelta las cien.

Esa línea con los tipos es la razón principal para preferir el tibble mientras se explora: la mitad de los problemas de un análisis son una columna que uno creía numérica y era texto, y aquí se ve sin tener que pedir nada.

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

Cuando de verdad hacen falta más filas o más columnas, se piden:

print() en un tibble: decidir cuánto se imprime.

  • print(n = 4): cuatro filas en vez de diez. n = Inf las imprime todas.
  • width = Inf: todas las columnas, aunque no quepan a lo ancho.
  • View(tabla): abre la tabla completa en una ventana de RStudio, que casi siempre es lo que uno quería.
tb %>%
  print(n = 4, width = Inf)
## # A tibble: 100 × 5
##   a                   b              c      d e    
##   <dttm>              <date>     <int>  <dbl> <chr>
## 1 2026-09-09 14:53:31 2026-09-27     1 0.559  o    
## 2 2026-09-09 21:22:45 2026-09-09     2 0.250  o    
## 3 2026-09-09 16:16:22 2026-09-11     3 0.0653 d    
## 4 2026-09-10 14:02:36 2026-09-10     4 0.573  v    
## # ℹ 96 more rows
lubridate::now()
## [1] "2026-09-09 14:05:49 AST"
lubridate::today()
## [1] "2026-09-09"
  • Para convertir un data frame en tibble se usa as_tibble().

  • Para convertir un tibble en data frame se usa as.data.frame().

as_tibble() y as.data.frame(): pasar de un formato al otro.

  • as_tibble(df): envuelve un data frame como tibble. No copia los datos ni los cambia; solo cambia cómo se imprime y cómo se comporta.
  • as.data.frame(tb): el camino de vuelta. Hace falta cuando una función vieja no acepta tibbles.
  • Ojo con los nombres de fila: as_tibble() los descarta. Si los necesitas, guárdalos antes en una columna con tibble::rownames_to_column().

17.6 Diferencias entre un tibble y un data frame

Son cuatro, y conviene tenerlas presentes porque explican casi todos los tropiezos del principio.

1. La impresión.

  • 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:

2. Operaciones aritméticas en tibbles.

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

Es decir: multiplicar la tabla entera por 2 funciona, pero lo que sale ya no es un tibble. No es un problema grave, pero sí explica por qué a veces una tabla “deja de imprimirse bonito” en medio de un análisis. La manera correcta de hacer aritmética sobre una tabla es columna por columna, con mutate(), como en el segundo bloque.

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

3. Nada de coincidencias parciales.

  • 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 # el nombre completo: funciona igual en los dos
## [1] 1

Ahora la comparación que importa. La misma errata, $a en vez de $abc, en las dos clases de tabla:

df$a     # data.frame: adivina y devuelve 1, sin avisar
## [1] 1
df2$a    # tibble: devuelve NULL y avisa
## Warning: Unknown or uninitialised column: `a`.
## NULL

Este es el mejor argumento a favor del tibble. En un data frame, escribir mal el nombre de una columna puede devolverte otra columna sin decir nada, y el análisis sigue con la variable equivocada. El tibble te devuelve NULL y una advertencia, así que el error aparece de inmediato.

4. Sacar una columna: $, [[ y [.

  • Para extraer una columna de un tibble se usa [[. Es más seguro que $ porque acepta el nombre como texto y nunca hace coincidencias parciales:

$, [[ y [: tres maneras de sacar datos de una tabla, y no dan lo mismo.

  • tabla$columna: devuelve el vector. Cómodo, pero el nombre va escrito directamente en el código.
  • tabla[["columna"]]: devuelve el vector. Acepta el nombre entre comillas o el número de posición, así que sirve dentro de una función o de un bucle.
  • tabla["columna"]: con un solo corchete devuelve una tabla de una columna, no un vector. En un data frame, df[, "columna"] devuelve un vector; en un tibble devuelve un tibble, y esa diferencia rompe código viejo.
  • Dentro de un pipe de magrittr: tabla %>% .$columna o tabla %>% .[["columna"]], donde el punto es la tabla que viene por el pipe.

17.7 Selección de subconjuntos de datos

El bloque siguiente saca la misma columna de vuelos de cuatro maneras distintas, dos directas y dos dentro de un pipe. Todas devuelven exactamente lo mismo; están juntas para que reconozcas las cuatro cuando las veas en código ajeno.

En una cadena del tidyverse casi siempre es mejor pull(columna) que .$columna: hace lo mismo, se lee mejor y funciona igual con el pipe nativo.

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

17.8 Cuándo hay que volver a un data.frame

Casi todo el código de R moderno acepta tibbles sin problema. Los que no, son paquetes viejos que suponen que tabla[, "columna"] devuelve un vector, o que esperan nombres de fila. Cuando una función se queja de forma rara, la prueba rápida es pasarle as.data.frame(mi_tibble) y ver si el problema desaparece.

El data.frame viene del lenguaje S, de los Laboratorios Bell, y pasó a R casi sin cambios. El paquete tibble lo reescribió en 2016, dentro del tidyverse liderado por Hadley Wickham, con una regla explícita: “hacer menos y quejarse más”. La palabra tibble sale de cómo suena “tbl”, la abreviatura que ya usaba dplyr para sus tablas.


17.9 Ejercicios del libro R4DS

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


17.10 Ejercicios del capítulo

Sobre los ejercicios de este capítulo. Cada ejercicio se entrega con tres cosas: el script, el resultado (que el bloque corra) y una explicación en palabras. Los ejercicios usan millas y paises del paquete datos, y tablas que escribirás a mano, no vuelos, que es el conjunto del capítulo. La hoja completa para entregar está en Ejercicios/Ejercicios_Capitulo_17_tibbles.Rmd.

17.10.1 Ejercicio 1. Completar el tibble

El bloque del principio del capítulo construye solo seis de las ocho filas que pedía el enunciado. Complétalo: secuencia del 1 al 8; edad con 23, 26, 24, 26, 27, 11, 20, 21; y nombre con Jose, Maria, Carol, Moncho, Liz, Maria, Jorge y Miguel.

Verificación: tu tibble debe tener 8 filas y 3 columnas, y la línea de tipos debe decir <int> o <dbl> para las dos primeras y <chr> para la tercera.

En palabras: ¿qué pasa si le das a una columna siete valores en vez de ocho? Pruébalo en un bloque con error=TRUE y explica el mensaje. ¿Por qué funciona si le das uno solo?

# Escribe tu código aquí

17.10.2 Ejercicio 2. Una tabla escrita a mano

Con tribble(), escribe una tabla de cuatro parcelas de campo con tres columnas: parcela (texto), n_plantas (número entero) y humedad (texto: “alta” o “baja”). Invéntate los valores.

Verificación: 4 filas, 3 columnas, y los tipos correctos en la línea de tipos.

En palabras: ¿en qué situación preferirías tribble() a tibble()? Da un ejemplo de tu propio trabajo o de la clase.

# Escribe tu código aquí

17.10.3 Ejercicio 3. Ida y vuelta

Convierte millas en data frame con as.data.frame(), guárdalo, y conviértelo otra vez en tibble con as_tibble(). Comprueba las dos veces con is_tibble() y con is.data.frame().

Verificación: is.data.frame() da TRUE en los tres objetos; is_tibble() solo en dos de los tres.

En palabras: ¿por qué is.data.frame() dice TRUE incluso para el tibble? ¿Qué relación hay entre las dos clases?

# Escribe tu código aquí

17.10.4 Ejercicio 4. Imprimir lo justo

Imprime paises de cuatro maneras: tal cual, con print(n = 3), con print(n = Inf, width = Inf) (no lo hagas dentro del documento final, es enorme), y como data frame con as.data.frame(paises).

Verificación: la impresión normal enseña 10 filas y dice cuántas quedaron fuera.

En palabras: además del número de filas, ¿qué información te da el tibble que el data frame no te da? ¿Por qué esa información ahorra tiempo al principio de un análisis?

# Escribe tu código aquí

17.10.5 Ejercicio 5. La errata que no avisa

Crea pais_df <- as.data.frame(paises) y pais_tb <- as_tibble(paises). En los dos, pide la columna con el nombre incompleto: $pib en vez de $pib_per_capita.

Verificación: una de las dos devuelve datos y la otra devuelve NULL con una advertencia.

En palabras: imagina que esa línea está en el medio de un análisis de 200 líneas. ¿Cuál de los dos comportamientos prefieres y por qué? Este es el argumento más fuerte del capítulo a favor del tibble: escríbelo con tus palabras.

# Escribe tu código aquí

17.10.6 Ejercicio 6. $, [[ y [ no dan lo mismo

Con pais_tb y pais_df del ejercicio anterior, saca la columna esperanza_de_vida de cuatro maneras: con $, con [["..."]], con ["..."] (un solo corchete) y con [, "..."]. Usa class() en cada resultado.

Verificación: dos de las cuatro devuelven un vector y las otras dos una tabla, y [, "..."] no se comporta igual en el data frame que en el tibble.

En palabras: ¿cuál de las cuatro usarías dentro de una función que recibe el nombre de la columna como texto? ¿Por qué esa diferencia de [, "..."] puede romper un script viejo?

# Escribe tu código aquí

17.10.7 Ejercicio 7 (BONO). Los nombres de fila se pierden

mtcars guarda los modelos de carro en los nombres de fila, no en una columna. Míralos con rownames(mtcars), conviértelo con as_tibble() y vuelve a mirar. Después hazlo bien con tibble::rownames_to_column().

Verificación: el tibble hecho con as_tibble() tiene 11 columnas y ya no sabes qué carro es cada fila; el hecho con rownames_to_column() tiene 12.

En palabras: ¿por qué el tibble decidió no guardar nombres de fila? Piensa en qué son realmente esos nombres y en dónde deberían estar según lo que aprendiste sobre datos ordenados.

# Escribe tu código aquí