Capítulo 1. Conceptos básicos de R
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
Este capítulo cubre los aspectos básicos: instalación y uso de paquetes y carga de datos.
La mayoría de de las recetas de este libro requieren tener instalados en tu ordenador los paquetes ggplot2, dplyr y gcookbook. (El paquete gcookbook contiene los conjuntos de datos utilizados en algunos de los ejemplos, pero no es necesario para realizar tu trabajo real). Si quieres empezar rápidamente, ejecuta
install.packages
(
"tidyverse"
)
install.packages
(
"gcookbook"
)
Entonces, en cada sesión de R, antes de ejecutar los ejemplos de este libro, puedes cargarlos con:
library
(
tidyverse
)
library
(
gcookbook
)
Al ejecutar library(tidyverse)
se cargarán ggplot2, dplyr y otros paquetes. Si quieres mantener tu sesión de R más racionalizada y cargar sólo los paquetes estrictamente necesarios, puedes cargar los paquetes ggplot2 y dplyr individualmente:
library
(
ggplot2
)
library
(
dplyr
)
library
(
gcookbook
)
Nota
Si quieres comprender mejor cómo funciona ggplot2, consulta el Apéndice A, que explica los conceptos que hay detrás de ggplot2.
Paquetes en R son colecciones de funciones y/o datos que se agrupan para facilitar su distribución, e instalar un paquete ampliará la funcionalidad de R en tu ordenador. Si un usuario de R crea un paquete y cree que puede ser útil para otros, puede distribuirlo a través de un repositorio de paquetes. El principal repositorio para distribuir paquetes de R se llama CRAN (Comprehensive R Archive Network), pero hay otros, como Bioconductor, especializado en paquetes relacionados con datos genómicos.
Si has pasado mucho tiempo aprendiendo R, puede que hayas oído hablar deltidyverse, que es una colección de paquetes de R que comparten ideas comunes sobre cómo deben estructurarse y manipularse los datos. Esto contrasta conel R base, que es el conjunto de paquetes que se incluyen cuando simplemente descargas e instalas R. El tidyverse es un conjunto de complementos para R, que facilitan la realización de muchas operaciones relacionadas con la manipulación y visualización de datos. Este libro utiliza principalmente el tidyverse, ya que creo que proporciona una forma más rápida y sencilla (¡pero no por ello menos potente!) de trabajar con datos.
Si no has utilizado antes el tidyverse, hay una receta en particular que deberías leer y que te ayudará a entender un trozo de sintaxis de aspecto extraño, %>%
, también conocido como operador de tubería. Se trata de la Receta 1.7 de este capítulo.
1.1 Instalar un paquete
Solución
Utiliza install.packages()
y dale el nombre del paquete que quieras instalar. Para instalar ggplot2, ejecuta
install.packages
(
"ggplot2"
)
Llegados a este punto, puede que se te pida que selecciones una réplica de descarga. Normalmente es mejor utilizar la primera opción, https://cloud.r-project.org/, ya que es una réplica basada en la nube con puntos finales en todo el mundo.
Debate
Si quieres instalar varios paquetes a la vez, puedes pasarle un vector de nombres de paquetes. Por ejemplo, esto instalará la mayoría de los paquetes utilizados en este libro:
install.packages
(
c
(
"tidyverse"
,
"gcookbook"
))
Cuando le digas a R que instale un paquete, instalará automáticamente cualquier otro paquete del que dependa el primero.
1.2 Cargar un paquete
Solución
Utiliza library()
y dale el nombre del paquete que quieres instalar. Para cargar ggplot2, ejecuta:
library
(
ggplot2
)
El paquete debe estar ya instalado en el ordenador.
Debate
La mayoría de las recetas de este libro requieren cargar un paquete antes de ejecutar el código, ya sea para las funciones gráficas (como en el paquete ggplot2) o para conjuntos de datos de ejemplo (como en los paquetes MASS y gcookbook).
Una de las peculiaridades de R es la terminología paquete/biblioteca. Aunque utilices la función library()
para cargar un paquete, un paquete no es una biblioteca, y algunos usuarios veteranos de R se enfadarán si lo llamas así.
Una biblioteca es un directorio que contiene un conjunto de paquetes. Por ejemplo, puedes tener una biblioteca para todo el sistema y otra para cada usuario.
1.3 Actualizar paquetes
Solución
Ejecuta update.packages()
:
update.packages
()
Te preguntará por cada paquete que se pueda actualizar. Si quieres que actualice todos los paquetes sin preguntar, utiliza ask = FALSE
:
update.packages
(
ask
=
FALSE
)
Debate
Con el tiempo, los autores de los paquetes publicarán nuevas versiones de los mismos con correcciones de errores y nuevas funciones, y suele ser una buena idea mantenerse al día. Sin embargo, ten en cuenta que ocasionalmente las nuevas versiones de los paquetes introducirán errores o tendrán un comportamiento ligeramente modificado.
1.4 Cargar un archivo de datos de texto delimitado
Solución
La forma más común de leer un archivo es utilizar datos separados por comas (CSV):
data
<-
read.csv
(
"datafile.csv"
)
Como alternativa, puedes utilizar la función read_csv()
(nótese el guión bajo en lugar del punto) del paquete readr. Esta función es significativamente más rápida que read.csv()
, y tiene un mejor manejo de las cadenas y de la fecha y hora.
Debate
Como los ficheros de datos tienen muchos formatos diferentes, hay muchas opciones para cargarlos. Por ejemplo, si el fichero de datos no tiene cabeceras en la primera fila:
data
<-
read.csv
(
"datafile.csv"
,
header
=
FALSE
)
El marco de datos resultante tendrá columnas llamadas V1
, V2
, etc., y probablemente querrás renombrarlas manualmente:
# Manually assign the header names
names
(
data
)
<-
c
(
"Column1"
,
"Column2"
,
"Column3"
)
Puedes establecer el delimitador con sep
. Si está delimitado por espacios, utilizasep = " "
. Si está delimitado por tabuladores, utiliza \t
, como en:
data
<-
read.csv
(
"datafile.csv"
,
sep
=
"\t"
)
Por defecto, las cadenas de los datos se tratan como factores. Supongamos que éste es tu archivo de datos, y que lo lees utilizando read.csv()
:
"First","Last","Sex","Number" "Currer","Bell","F",2 "Dr.","Seuss","M",49 "","Student",NA,21
El marco de datos resultante almacenará First
y Last
como factores, aunque en este caso tiene más sentido tratarlos como cadenas (ovectores de caracteres en la terminología de R). Para diferenciar esto, utilizastringsAsFactors = FALSE
. Si hay columnas que deban tratarse como factores, puedes convertirlas individualmente:
data
<-
read.csv
(
"datafile.csv"
,
stringsAsFactors
=
FALSE
)
# Convert to factor
data
$
Sex
<-
factor
(
data
$
Sex
)
str
(
data
)
#> 'data.frame': 3 obs. of 4 variables:
#> $ First : chr "Currer" "Dr." ""
#> $ Last : chr "Bell" "Seuss" "Student"
#> $ Sex : Factor w/ 2 levels "F","M": 1 2 NA
#> $ Number: int 2 49 21
Alternativamente, podrías cargar el archivo con cadenas como factores, y luego convertir las columnas individuales de factores a caracteres.
1.5 Cargar datos desde un archivo Excel
Debate
Con read_excel()
, puedes cargar desde otras hojas especificando un número o nombre para sheet
:
data
<-
read_excel
(
"datafile.xls"
,
sheet
=
2
)
data
<-
read_excel
(
"datafile.xls"
,
sheet
=
"Revenues"
)
read_excel()
utiliza la primera fila de la hoja de cálculo para los nombres de las columnas. Si no quieres utilizar esa fila para los nombres de las columnas, utilizacol_names = FALSE
. En su lugar, las columnas se denominarán X1
, X2
, y así sucesivamente.
Por defecto, read_excel()
deducirá el tipo de cada columna, pero si quieres especificar el tipo de cada columna, puedes utilizar el argumento col_types
. También puedes eliminar columnas si especificas el tipo como"blank"
:
# Drop the first column, and specify the types of the next three columns
data
<-
read_excel
(
"datafile.xls"
,
col_types
=
c
(
"blank"
,
"text"
,
"date"
,
"numeric"
))
Ver también
Consulta ?read_excel
para ver más opciones para controlar la lectura de estos archivos.
Existen otros paquetes para leer archivos Excel. El paquete gdata tiene una función read.xls()
para leer archivos .xls, y el paquete xlsx tiene una función read.xlsx()
para leer archivos .xlsx. Requieren la instalación de software externo en tu ordenador: read.xls()
requiere Java, y read.xlsx()
requiere Perl.
1.6 Cargar datos de archivos SPSS/SAS/Stata
Debate
El paquete haven también incluye funciones para leer desde otros formatos:
-
read_sas()
: SAS -
read_dta()
: Stata
Una alternativa a haven en es el paquete foreign. También admite archivos SPSS y Stata, pero no está tan actualizado como las funciones de haven. Por ejemplo, sólo admite archivos Stata hasta la versión 12, mientras que haven admite hasta la versión 14 (la versión actual en el momento de escribir esto).
El paquete extranjero admite algunos otros formatos, entre ellos:
-
read.octave()
: Octave y MATLAB -
read.systat()
: SYSTAT -
read.xport()
: SAS XPORT -
read.dta()
: Stata -
read.spss()
: SPSS
1.7 Encadenar funciones con %>%, el operador tubería
Solución
Utiliza %>%
, el operador de tuberías. Por ejemplo:
library
(
dplyr
)
# The pipe is provided by dplyr
morley
# Look at the morley data set
#> Expt Run Speed
#> 001 1 1 850
#> 002 1 2 740
#> 003 1 3 900
#> ...<94 more rows>...
#> 098 5 18 800
#> 099 5 19 810
#> 100 5 20 870
morley
%>%
filter
(
Expt
==
1
)
%>%
summary
()
#> Expt Run Speed
#> Min. :1 Min. : 1.00 Min. : 650
#> 1st Qu.:1 1st Qu.: 5.75 1st Qu.: 850
#> Median :1 Median :10.50 Median : 940
#> Mean :1 Mean :10.50 Mean : 909
#> 3rd Qu.:1 3rd Qu.:15.25 3rd Qu.: 980
#> Max. :1 Max. :20.00 Max. :1070
Toma el conjunto de datos morley
y lo pasa a la función filter()
de dplyr, manteniendo sólo las filas de los datos en las que Expt
es igual a 1. A continuación, ese resultado se pasa a la función summary()
, que calcula algunas estadísticas de resumen de los datos.
Sin el operador tubería, el código anterior se escribiría así:
summary
(
filter
(
morley
,
Expt
==
1
))
En este código, las llamadas a funciones se procesan de dentro hacia fuera. Desde un punto de vista matemático, esto tiene mucho sentido, pero desde el punto de vista de la legibilidad, puede resultar confuso y difícil de leer, sobre todo cuando hay muchas llamadas a funciones anidadas.
Debate
Este patrón, con el operador %>%
, se utiliza mucho con los paquetes tidyverse, porque contienen muchas funciones que hacen cosas relativamente pequeñas. La idea es que estas funciones sean bloques de construcción que permitan a los usuarios componer las llamadas a las funciones para producir el resultado deseado.
Para ilustrar lo que ocurre, aquí tienes un ejemplo más sencillo de dos fragmentos de código equivalentes:
f
(
x
)
# Equivalent to:
x
%>%
f
()
En esencia, el operador tubería toma lo que está a la izquierda y lo coloca como primer argumento de la llamada a la función que está a la derecha.
Puede utilizarse para varias llamadas a funciones, en una cadena:
h
(
g
(
f
(
x
)))
# Equivalent to:
x
%>%
f
()
%>%
g
()
%>%
h
()
En una cadena de funciones, el orden léxico de las llamadas a funciones es el mismo que el orden en que se calculan.
Si quieres almacenar el resultado final, puedes utilizar el operador <-
al principio. Por ejemplo, esto sustituirá el x
original por el resultado de la cadena de funciones:
x
<-
x
%>%
f
()
%>%
g
()
%>%
h
()
Si hay argumentos adicionales para las llamadas a la función, se desplazarán a la derecha cuando se utilice el operador tubería. Volviendo al código del primer ejemplo, estos dos son equivalentes:
filter
(
morley
,
Expt
==
1
)
morley
%>%
filter
(
Expt
==
1
)
En realidad, el operador de tuberías procede del paquete magrittr, pero dplyr lo importa y lo pone a tu disposición cuando llamas a library(dplyr)
.
Ver también
Para ver muchos más ejemplos de cómo utilizar %>%
en la manipulación de datos, consultael Capítulo 15.
Get R Graphics Cookbook, 2ª Edición now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.