Marco de datos y tibbles

Data Framework Tibbles Data Science

Abordamos la primera etapa en el manejo de datos. Podrá explorar la base de datos. Para ello, tiene que familiarizarse con las funciones de marco de datos base de R y también verá las funciones del paquete tibbles que es parte de tidyverse de RStudio.

Franklin Santos https://franklinsantos.com (Agritech Bolivia)
11-03-2021

Marcos de datos y Tibbles

Cree estructuras de datos tabulares con marcos de datos y vea cómo se comparan con tibbles. Extraiga vectores de columna de marcos de datos para realizar cálculos. Obtenga información de metadatos como dimensiones. Seleccione las filas superior e inferior para obtener una descripción general rápida.

Construye un marco de datos a partir de vectores

Los datos tabulares son el formato más común utilizado por los científicos de datos. En R, las tablas se representan mediante marcos de datos. Pueden inspeccionarse imprimiéndolos en la consola.

data.frame(___ = ___, 
           ___ = ___, 
           ...)

Introducción a los marcos de datos

En análisis y estadísticas, los datos tabulares son la estructura de datos más importante. Está presente en muchos formatos comunes como archivos de Excel, valores separados por comas (CSV) o bases de datos. R integra objetos de datos tabulares como ciudadanos de primera clase en el idioma a través de marcos de datos. Los marcos de datos permiten a los usuarios leer y manipular fácilmente datos tabulares dentro del lenguaje R.

Echemos un vistazo a un objeto de marco de datos llamado Davis, del paquete carData, que incluye medidas de altura y peso para 200 hombres y mujeres:

tibble (Davis)
# A tibble: 200 × 5
   sex   weight height repwt repht
   <fct>  <int>  <int> <int> <int>
 1 M         77    182    77   180
 2 F         58    161    51   159
 3 F         53    161    54   158
 4 M         68    177    70   175
 5 F         59    157    59   155
 6 M         76    170    76   165
 7 M         76    167    77   165
 8 M         69    186    73   180
 9 M         71    178    71   175
10 M         65    171    64   170
# … with 190 more rows

De la salida impresa, podemos ver que el marco de datos abarca más de 200 filas y 5 columnas. En el ejemplo anterior, cada fila contiene datos de una persona a través de atributos, que corresponden a las columnas sex, weight, height, repwt (peso reportado) y repht (altura reportado).

Por ejemplo, la primera fila de la tabla especifica un hombre que pesa 77 kg y tiene una altura de 182 cm. Los pesos reportados están muy cerca de 77 kg y 180 cm, respectivamente.

Las filas en un marco de datos se identifican además por los nombres de fila a la izquierda, que son simplemente los números de fila por defecto. En el caso del conjunto de datos de Davis anterior, los nombres de las filas van de 1 a 200.

Crear marcos de datos

data.frame(___ = ___, 
           ___ = ___, 
           ...)

Los marcos de datos contienen datos tabulares en varias columnas o atributos. Cada columna está representada por un vector de diferentes tipos de datos como números o caracteres. La función data.frame() admite la construcción de objetos de marco de datos combinando diferentes vectores en una tabla. Para formar una tabla, se requiere que los vectores tengan la misma longitud. Un marco de datos también puede verse como una colección de vectores conectados entre sí para formar una tabla.

Creemos nuestro primer marco de datos con cuatro personas diferentes, incluidos sus identificadores, nombres e indicadores si son mujeres o no. Cada uno de estos atributos es creado por un vector diferente de diferentes tipos de datos (numéricos, de caracteres y lógicos). Los atributos finalmente se combinan en una tabla usando la función data.frame():

data.frame(
  c(1, 2, 3, 4),
  c("Louisa", "Jonathan", "Luigi", "Rachel"),
  c(TRUE, FALSE, FALSE, TRUE)
)
  c.1..2..3..4. c..Louisa....Jonathan....Luigi....Rachel..
1             1                                     Louisa
2             2                                   Jonathan
3             3                                      Luigi
4             4                                     Rachel
  c.TRUE..FALSE..FALSE..TRUE.
1                        TRUE
2                       FALSE
3                       FALSE
4                        TRUE

El marco de datos resultante almacena los valores de cada vector en una columna diferente. Tiene cuatro filas y tres columnas. Sin embargo, los nombres de las columnas impresas en la primera línea parecen incluir los valores de las columnas separados por puntos, lo cual es un esquema de nombres muy extraño.

Los nombres de columna se pueden incluir en la construcción de data.frame() como nombres de argumentos que preceden a los valores de los vectores de columna. Para mejorar el nombre de la columna del marco de datos anterior, podemos escribir

data.frame(
  id = c(1, 2, 3, 4),
  name = c("Louisa", "Jonathan", "Luigi", "Rachel"),
  female = c(TRUE, FALSE, FALSE, TRUE)
)
  id     name female
1  1   Louisa   TRUE
2  2 Jonathan  FALSE
3  3    Luigi  FALSE
4  4   Rachel   TRUE

El marco de datos resultante incluye los nombres de columna necesarios para ver el significado real de las diferentes columnas.

Crea y convierte tibbles

Tibbles son la reimaginación moderna de marcos de datos y comparten muchos puntos en común con sus antepasados. La diferencia más visible es cómo se imprime el contenido de tibble en la consola. Tibbles son parte del tidyverse y se utilizan por su comportamiento más consistente en comparación con los marcos de datos.

tibble(___ = ___, 
       ___ = ___, 
       ...)
as_tibble(___)

Introducción a Tibbles

Una reinvención moderna del marco de datos https://tibble.tidyverse.org

Tibbles son en muchos aspectos similares a los marcos de datos. De hecho, se heredan de los marcos de datos, lo que significa que todas las funciones y características disponibles para los marcos de datos también funcionan para tibbles. Por tanto, cuando hablamos de marcos de datos también nos referimos a tibbles.

Además de todo lo que ofrece un marco de datos, los tibbles tienen un comportamiento más consistente con una mejor usabilidad en muchos casos. Lo más importante es que cuando se imprime un objeto tibble en la consola, muestra automáticamente solo las primeras 10 filas y condensa columnas adicionales. Por el contrario, un marco de datos llena toda la pantalla de la consola con valores que pueden generar confusión. Echemos un vistazo al conjunto de datos gapminder del paquete gapminder:

gapminder::gapminder
# A tibble: 1,704 × 6
   country     continent  year lifeExp      pop gdpPercap
   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
 1 Afghanistan Asia       1952    28.8  8425333      779.
 2 Afghanistan Asia       1957    30.3  9240934      821.
 3 Afghanistan Asia       1962    32.0 10267083      853.
 4 Afghanistan Asia       1967    34.0 11537966      836.
 5 Afghanistan Asia       1972    36.1 13079460      740.
 6 Afghanistan Asia       1977    38.4 14880372      786.
 7 Afghanistan Asia       1982    39.9 12881816      978.
 8 Afghanistan Asia       1987    40.8 13867957      852.
 9 Afghanistan Asia       1992    41.7 16317921      649.
10 Afghanistan Asia       1997    41.8 22227415      635.
# … with 1,694 more rows

Inmediatamente vemos que el conjunto de datos gapminder es un tibble que consta de 1,704 filas y 6 columnas en la línea superior. En la segunda línea podemos ver los nombres de las columnas y sus correspondientes tipos de datos directamente debajo.

Por ejemplo, la columna country tiene el tipo <fct> (que es la abreviatura de “factor”), year es un número entero <int> y la esperanza de vida lifeExp es un <dbl>, un número decimal.

Creando Tibbles

tibble(___ = ___, 
       ___ = ___, 
       ...)
as_tibble(___)

La creación de tibbles funciona exactamente igual que para los marcos de datos. Podemos usar la función tibble() del paquete tibble para crear un nuevo objeto tabular.

Por ejemplo, un tibble que contenga datos de cuatro personas diferentes y tres columnas se puede crear así:

library(tibble)
tibble(
  id = c(1, 2, 3, 4),
  name = c("Louisa", "Jonathan", "Luigi", "Rachel"),
  female = c(TRUE, FALSE, FALSE, TRUE)
)
# A tibble: 4 × 3
     id name     female
  <dbl> <chr>    <lgl> 
1     1 Louisa   TRUE  
2     2 Jonathan FALSE 
3     3 Luigi    FALSE 
4     4 Rachel   TRUE  

Conversión de marcos de datos a Tibbles

Si prefiere tibbles a marcos de datos por sus características adicionales, también se pueden convertir a partir de marcos de datos existentes con la función as_tibble().

Por ejemplo, el marco de datos de Davis del paquete carData se puede convertir a un tibble así:

as_tibble(Davis)
# A tibble: 200 × 5
   sex   weight height repwt repht
   <fct>  <int>  <int> <int> <int>
 1 M         77    182    77   180
 2 F         58    161    51   159
 3 F         53    161    54   158
 4 M         68    177    70   175
 5 F         59    157    59   155
 6 M         76    170    76   165
 7 M         76    167    77   165
 8 M         69    186    73   180
 9 M         71    178    71   175
10 M         65    171    64   170
# … with 190 more rows

Extraiga o reemplace columnas en un marco de datos usando $

Las columnas de un marco de datos se pueden extraer y manipular fácilmente con el operador $. Incluso se pueden agregar nuevas columnas asignando un vector.

___$___
___$___  <- ___

Extraer columnas con $

Los marcos de datos son tablas que resultan de la combinación de vectores de columna. Los usuarios pueden interactuar con los marcos de datos a través de numerosos operadores para extraer, agregar o recombinar valores. Para extraer columnas individuales de un marco de datos, R ofrece un operador muy específico: el dólar $. Devuelve el vector de columna como lo indica su nombre basado en un marco de datos que precede a $.

Para ver el operador $ en acción, extraigamos la población pop (en 1,000) de diferentes estados de los EE. UU. Según el conjunto de datos de los estados (de 1992) en el paquete carData:

carData::States$pop
 [1]  4041   550  3665  2351 29760  3294  3287   666   607 12938  6478
[12]  1108  1007 11431  5544  2777  2478  3685  4220  1228  4781  6016
[23]  9295  4375  2573  5117   799  1578  1202  1109  7730  1515 17990
[34]  6629   639 10847  3146  2842 11882  1003  3487   696  4877 16987
[45]  1723   563  6187  4867  1793  4892   454

El comando extrae la columna de población como vector del marco de datos. A partir de este vector podemos calcular la sum() de la población total como:

sum(States$pop)
[1] 248709

De manera similar, el salario promedio (en $1,000) de los maestros se puede calcular como la mean() de la columna pay:

mean(States$pay)
[1] 30.94118

Determinar el tamaño de un marco de datos

El tamaño de un marco de datos, como el número de filas o columnas, a menudo es necesario y se puede determinar de varias formas.

nrow(___)
ncol(___)
dim(___)
length(___)

Dimensiones del marco de datos

El número de filas y columnas en un marco de datos se puede adivinar a través de la salida impresa del marco de datos. Sin embargo, es mucho más fácil obtener esta información directamente a través de funciones. Además, es posible que desee utilizar esta información en algunas partes del código.

Los marcos de datos tienen dos dimensiones. El número de filas se considera la primera dimensión. Por lo general, define el número de observaciones en un conjunto de datos. Para obtener el número de filas del marco de datos de Davis en el conjunto de datos carData, use la función nrow():

nrow(Davis)
[1] 200

De manera similar, el número de columnas o atributos del marco de datos se puede recuperar con ncol():

ncol(Davis)
[1] 5

Recuperar las dimensiones del marco de datos

Para recuperar el tamaño de todas las dimensiones de un marco de datos a la vez, puede usar la función dim(). dim() devuelve un vector con dos elementos, el primer elemento es el número de filas y el segundo elemento el número de columnas.

Por ejemplo, las dimensiones del conjunto de datos de Davis se pueden recuperar como:

dim(Davis)
[1] 200   5

Además de los marcos de datos, dim() también se puede utilizar para otros objetos R multidimensionales, como matrices. Sin embargo, cuando se usa con vectores dim solo devuelve NULL:

dim(c(1, 3, 5, 7))
NULL

En cambio, la longitud de un vector se determina mediante length():

length(c(1, 3, 5, 7))
[1] 4

En el caso de un marco de datos, length() devuelve su número de columnas:

length(Davis)
[1] 5

Seleccionar la primera o la última fila de un marco de datos

A menudo no necesitamos mirar todo el contenido de un marco de datos en la consola. En cambio, solo algunas partes son suficientes, como la parte superior o inferior recuperada a través de las funciones head() y tail().

head(___, n = ___)
tail(___, n = ___)

Seleccionar la parte superior de un marco de datos

Los marcos de datos pueden abarcar una gran cantidad de filas y columnas. Según la salida impresa en la consola, puede ser difícil obtener una impresión inicial de los datos dentro del marco de datos. Este problema no es tanto un problema para tibbles que tienen una mejor salida de consola. Además, puede ser útil recuperar fácilmente las primeras filas en un comando sin indexación ni paquetes adicionales.

El conjunto de datos TitanicSurvival contiene datos de 1309 pasajeros representados como filas. Una simple impresión del conjunto de datos imprimiría a todos los pasajeros, llenando toda la consola. En cambio, la función head() muestra solo las primeras 10 filas de un marco de datos, incluidos los nombres de sus columnas:

head(TitanicSurvival)
                                survived    sex     age
Allen, Miss. Elisabeth Walton        yes female 29.0000
Allison, Master. Hudson Trevor       yes   male  0.9167
Allison, Miss. Helen Loraine          no female  2.0000
Allison, Mr. Hudson Joshua Crei       no   male 30.0000
Allison, Mrs. Hudson J C (Bessi       no female 25.0000
Anderson, Mr. Harry                  yes   male 48.0000
                                passengerClass
Allen, Miss. Elisabeth Walton              1st
Allison, Master. Hudson Trevor             1st
Allison, Miss. Helen Loraine               1st
Allison, Mr. Hudson Joshua Crei            1st
Allison, Mrs. Hudson J C (Bessi            1st
Anderson, Mr. Harry                        1st

El número de columnas se puede ajustar mediante el parámetro n. Para extraer solo las primeras tres filas del conjunto de datos, puede escribir:

head(TitanicSurvival, n = 3)
                               survived    sex     age passengerClass
Allen, Miss. Elisabeth Walton       yes female 29.0000            1st
Allison, Master. Hudson Trevor      yes   male  0.9167            1st
Allison, Miss. Helen Loraine         no female  2.0000            1st

Seleccionar la parte inferior de un marco de datos

La función tail() se puede utilizar para seleccionar las filas inferiores de un marco de datos. Similar a la función head(), también acepta un parámetro n para especificar el número de filas que se devolverán.

Por ejemplo, para seleccionar las últimas cinco filas del conjunto de datos TitanicSurvival, puede escribir:

tail(TitanicSurvival, n = 5)
                          survived    sex  age passengerClass
Zabour, Miss. Hileni            no female 14.5            3rd
Zabour, Miss. Thamine           no female   NA            3rd
Zakarian, Mr. Mapriededer       no   male 26.5            3rd
Zakarian, Mr. Ortin             no   male 27.0            3rd
Zimmerman, Mr. Leo              no   male 29.0            3rd

Las funciones de cabeza y cola también se pueden combinar para seleccionar un fragmento del conjunto de datos del medio. Para seleccionar las primeras cinco filas de las 500 filas inferiores, puede escribir:

head(tail(TitanicSurvival, n = 500), n = 5)
                                survived    sex age passengerClass
Ford, Mr. Edward Watson               no   male  18            3rd
Ford, Mr. William Neal                no   male  16            3rd
Ford, Mrs. Edward (Margaret Ann       no female  48            3rd
Fox, Mr. Patrick                      no   male  NA            3rd
Franklin, Mr. Charles (Charles        no   male  NA            3rd

Citation

For attribution, please cite this work as

Santos (2021, Nov. 3). Franklin Santos: Marco de datos y tibbles. Retrieved from https://franklinsantos.com/posts/2021-11-21-tibbles/

BibTeX citation

@misc{santos2021marco,
  author = {Santos, Franklin},
  title = {Franklin Santos: Marco de datos y tibbles},
  url = {https://franklinsantos.com/posts/2021-11-21-tibbles/},
  year = {2021}
}