2  Rlang

2.1 Paquetes y ambiente

2.1.1 Paquetes

Se pueden instalar las dependencias también - install.packages("pkg", dependencies=TRUE). A veces hay dependencias del sistema que también hay que instalar.

install.packages("pkg") instala un paquete
remove.packages("pkg") desinstala un paquete
old.packages("pkg") comprueba la versión del paquete
update.packages() actualiza todos los paquetes (o el definido)
sessionInfo() devuelve la versión de R y los paquetes cargados
.libPaths() devuelve la localización de los paquetes en el sistema
library() devuelve los paquetes instalados en RStudio
library("pkg") añade pkg al ambiente
detach("package:pkg", unload = TRUE) elimina el paquete del ambiente
search() lista los paquetes cargados y archivos del ambiente

2.1.2 Repositorios

Para descargar paquetes de un repositorio, se puede utilizar

  • install.packages() con el argumento repos=https://cran.rediris.es/ (o el correspondiente)
  • source(), definiendo en su interior el URL:
> source("https://bioconductor.org/biocLite.R")
> biocLite(c("GenomicFeatures", "AnnotationBi" ))

2.1.3 Ambiente

getwd() devuelve el directorio de trabajo
setwd() cambia el directorio de trabajo

2.2 Importar y exportar archivos

2.2.1 Importar

  • read.csv()
data <- read.csv("file.csv",
          header = FALSE, 
          sep = ","
        )
  • readr::read_csv()
  • readxl::read_excel() para .xls

2.2.2 Exportar

  • write.table() a .txt, especificando separador
  • write.csv()
  • xlsx::write.xlsx()
  • foreign::write.foreign("data", "file.spss", package="SPSS") (también exporta de SAS y otros programas estadísticos)

2.3 Tipos de datos

2.3.1 Vectores

  • solo permiten un tipo de dato
c(1,2,3)
[1] 1 2 3
a <- c("a", 1, 1.5)
print(a)
[1] "a"   "1"   "1.5"
is.vector(a)
[1] TRUE

2.3.1.1 Factores

x <- c("A", "B", "B", "A", "A")
x <- as.factor(x)
print(x)
[1] A B B A A
Levels: A B
levels(x) <- c("Anna", "Bob")
print(x)
[1] Anna Bob  Bob  Anna Anna
Levels: Anna Bob
bin <- c(0,1,1,0,1,0,1,1,0,0,1,0)
gen <- factor(bin,
                            levels=c(0,1),
                            labels=c("Mujer", "Hombre"))
print(gen)
 [1] Mujer  Hombre Hombre Mujer  Hombre Mujer  Hombre Hombre Mujer  Mujer 
[11] Hombre Mujer 
Levels: Mujer Hombre

2.3.2 Matrices

datos <- seq(1:20)
dimensiones <- c(4,5)       # c(rows, columns)
matriz <- matrix(datos, dimensiones)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    5    9   13   17
# [2,]    2    6   10   14   18
# [3,]    3    7   11   15   19
# [4,]    4    8   12   16   20
matriz[3,]
# 3 7 11 15 19
matriz[,2]
# 5 6 7 8
matriz[3,2]
# 7
Funciones Descripción
t() Transpose - cambia las filas por columnas
dim() Consultar y editar las dimensiones de la matriz (en forma de vector)
colSums() Suma de columnas
rowSums() Suma de filas
colMeans() Media de columnas
rowMeans() Media de filas

2.3.3 Listas

Permite cualquier tipo de dato (incluso otras listas):

num <- c(10,11,12)
x <- list("Text", num, 1.5)
# [[1]]
# [1] "Text"

# [[2]]
# [1] 10 11 12

# [[3]]
# [1] 2.5

El índice empieza en 1 (no en 0); se indexa con corchetes o dobles corchetes

x[1]
# "Text"
x[[2]][1]
# 10

Para eliminar un elemento se sustituye por NULL o se indexa con - delante (list[-i]):

x[2] <- NULL      # x[-2]
# [[1]]
# [1] "Text"

# [[2]]
# [1] 2.5

2.4 Conjuntos de datos

Comandos útiles
View(data) devuelve una tabla
dim(data) devuelve el número rows y cols
length(data) devuelve el número de variables
names(data) devuelve el nombre de las variables
head(data) devuelve las primeras observaciones
attach(data) integra el data frame en el ambiente
detach(data) elimina variables del data frame del ambiente
str(data) devuelve la estructura del objeto
Acceso al data frame
índice data[n]
fila data[n,]
columna data[,n]
variable data$var
variable condicional data$var1[data$var2 == 1]

2.4.1 Combinar conjuntos de datos

rbind() (row bind) concatena dos data frames que tengan las mismas variables, aunque aparezcan en un orden distinto.

merge() unifica las entradas en base a la coincidencia de alguna de sus columnas; por defecto omite aquellos elementos no representados en ambos data frames (unión interna o inner join).

La unión externa combina todas las entradas, convirtiendo los valores no coincidentes en NA; se hace con la opción all=TRUE:

z <- merge(x, y,
          all = TRUE     # todas las líneas ('x' e 'y')
        # all.x = TRUE   # todas las líneas de 'x' - unión izquierda
        # all.y = TRUE   # todas las líneas de 'y' - unión derecha
)

2.4.2 Filtros y subconjuntos

subset() sirve para generar nuevos conjuntos de datos a partir de selecciones:

  • a <- subset(x, select = c(Var1, Var2))
  • b <- subset(x, Var1 <=24)
  • c <- subset(x, Var1 == 1, select = c(-Var2)) (eliminar Var2)
  • Permite el uso de condicionales
    • d <- subset(x, Var1 < 5 | Var1 > 10)

sample() toma muestras aleatorias de un conjunto; el comando set.seed(int), si se define, permite reproducir las selecciones. Permite definir los índices a indexar, donde

i <- sample(x:y, n, replace=FALSE)
pop_sample <- dataframe[i,]
# devuelve 'm' líneas desde 'x' a 'y', a través del índice i

2.5 Condicionales

if (x == 2) {
    print("Just right")
} else if (x >= 5) {
    print("Too high") 
} else {
    print("Too low")
}

2.5.1 one-liner

if(x == 2){print("Just right")}

2.6 Loops

2.6.1 for loop

for (i in 1:length(df)) {
    if (df$var1[i] < 30) {
        print(i)
    }
}

2.7 Funciones

2.8 Recodificar variables

2.8.1 ifelse

Devuelve un valor sí se cumple una condición y otro si no lo hace:

a <- c(0,1,1,0,1,0,0)
b <- ifelse(a == 0, "female", "male")
print(b)
[1] "female" "male"   "male"   "female" "male"   "female" "female"

2.9 Descripción de datos

Comando Descripción
sort() ordena los datos
summary() resúmenes estadísticos
fivenum() mímino, Q1, media, Q3, máximo
min() mínimo
max() máximo
mean() media
median() mediana
range() (mínimo, máximo)
sd() desviación típica
var() varianza
cor() correlación

2.9.1 lapply y sapply

lapply() y su versión simplificada sapply() aplican una función a una lista, y devuelven sus resultados:

iris2 <- subset(iris, select = c(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width))
sapply(iris2, mean, na.rm=TRUE)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333 

2.9.2 aggregate

Subdivide los datos de una muestra y aplica una función estadísticos sobre cada subdivisión:

library(MASS)
aggregate(Tetrahydrocortisone ~ Type, data=Cushings, FUN=mean)
  Type Tetrahydrocortisone
1    a            2.966667
2    b            8.180000
3    c           19.720000
4    u           14.016667
plot(Cushings$Tetrahydrocortisone)

aggregate(iris[,1:4], by = list(iris$Species), FUN = mean)
     Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        5.006       3.428        1.462       0.246
2 versicolor        5.936       2.770        4.260       1.326
3  virginica        6.588       2.974        5.552       2.026

2.9.3 Tablas

  • table() - frecuencias absolutas
  • prop.table(data) - frecuencias relativas
  • knitr::kable() y knitr::kables() - markdown

Pasando dos argumentos hace una tabla de contingencia, que luego pueden ser utilizadas con test estadísticos que las utilizan (como \(\chi^{2}\) o el test de Fisher):

letters <- c("a", "b", "c", "c", "c", "a", "b", "b", "a")
numbers <- c(1,2,3,2,3,1,1,2,3)
table(letters, numbers)
       numbers
letters 1 2 3
      a 2 0 1
      b 1 2 0
      c 0 1 2

2.10 Simulación

set.seed() permite especificar una “semilla” para el generador de números aleatorio.

2.10.1 Floats - runif()

runif(n = n,
      min = min, 
      max = max)

2.10.2 Números enteros - sample()

replace = permite volver a sacar el mismo número; prob = define la probabilidad de que aparezca cualquiera de los elementos.

sample(min:max, n,
       replace = TRUE)  # permite repetir números
sample(1:6, 10, replace = TRUE,
       prob = c(1, 1, 1, 1, 6, 1))
 [1] 5 4 5 5 3 2 5 5 5 2

2.10.3 Generar múltiples instancias de una función - replicate()

replicate (
  n = 8,                # número de repeticiones
  { rnorm(4, 25, 5)}    # una función cualquiera
)
         [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]
[1,] 37.36451 20.47024 26.87435 20.57864 23.73142 35.82391 28.93165 25.93017
[2,] 29.24226 15.61959 27.52311 28.69677 26.90371 26.22942 28.70096 23.62187
[3,] 26.45862 31.39325 21.00204 20.04801 18.39523 18.52740 25.43375 21.33571
[4,] 29.63224 21.97318 25.15192 22.91632 26.28487 27.75149 32.13828 26.72102

2.10.4 Permutaciones y combinaciones

Requiere gtools:: | ——————–|— permutations() | Genera todas las permutaciones posibles de los elementos que se le pasan, atendiendo al orden en el que aparecen combinaations() | Genera todas las combinaciones posibles de los elementos que se le pasan (el orden no es importante)

2.11 Distribuciones

Distribuciones discretas Distribuciones contínuas
Binomial binom() Uniforme unif()
Poisson pois() Normal norm()
Geométrica geom() T de Student t()
Hipergeométrica hyper() F de Fisher F()
Binomial negativa nbinom() Chi-Cuadrado chisq()
Exponencial exp()

Las distintas opciones tiene un atajo en forma de prefijo:

Prefijo Función
d Función de densidad o probabilidad (mass probability)
p Función de distribución
q Cálculo de cuantiles
r random - muestra aleatoria

2.11.1 Distribución binomial

En el caso de la distribución binomial, donde

\[ \begin{aligned} X & \sim Binomial(n, \theta) \\ \\ Ejemplo: & \\ X & \sim Binomial(9, 0.7) \end{aligned} \]

podemos calcular la función de densidad para \(P(X=8)\) con dbinom():

dbinom(x = 8,
       size = 9,
       prob = 0.7)
[1] 0.1556496

la función de probabilidad para \(P(X \le 8)\) con pbinom()

pbinom(8, 9, 0.7)
[1] 0.9596464
plot(dbinom(0:9, 9, 0.7), type = "h",
     main = "Función de probabilidad",
     xlab = "x",
     ylab = "Probabilidad")

simular una población con esa distribución con rbinom()

rbinom(50, 9, 0.7)
 [1] 6 7 4 6 7 6 8 9 5 5 5 4 6 5 9 4 6 5 7 4 6 7 5 7 6 6 8 4 6 5 6 7 5 4 6 5 7 7
[39] 3 4 7 6 5 7 6 6 8 8 5 6
plot(table(rbinom(10000, 9, 0.7)),
     main = "10.000 casos simulados",
     xlab = "x",
     ylab = "Número de casos")

2.12 Representación gráfica

plot(x, y, ...) es la forma básica de generar gráficos en R - plot() abre una ventana con la base; los comandos siguientes dibujan elementos gráficos sobre ella.

Para cerrar la ventana se utiliza dev.off().

2.12.1 Exportar gráficos

  1. Crear el documento
  2. Generar el gráfico
  3. Cerrar el documento (device)

Existen opciones para muchos formatos:

pdf("file.pdf") PDF
svg("file.svg") svg
win.metafile("file.wmf") Windows Metafile
jpeg("file.jpg") jpg
png("file.png") png
bmp("file.bmp") bmp
postscript("file.ps") ps
svg("filename.svg")           # Abre el documento
plot(data$var1, data$var2)    # Vuelca el plot
dev.off()                     # Cierra y guarda el documento
file.show("filename.svg")

2.12.2 plot

La opción más básica es plot(); su argument type= permite modificar el tipo de gráfico:

type= Descripción
p puntos
l líneas
b both
c líneas (vacío en lugar de los puntos)
o overplot - líneas sobre los puntos
h histogram
s steps
S otro tipo de steps
n no plotting

2.12.2.1 Otras funciones en base::

  • stem()
  • hist()
  • boxplot()
  • pairs() - analiza las variables entre sí por parejas
  • barplot()
  • pie()
  • persp()

2.12.2.2 Funciones y opciones - high-level functions

High-level functions
xlab, ylab título del eje
xlim, ylim límites del eje c(min, max)
main título del gráfico
sub subtítulo del gráfico

2.12.2.3 Low-level functions

Se pueden añadir capas de datos a los gráficos

  • lines() - añade líneas entre puntos
  • abline() - añade una pendiente al gráfico
  • points() - añade puntos al gráfico
  • legend()
  • text()
  • grid() - en el fondo
  • title()

Los argumentos más habituales son

Opción Descripción
cex= escala del elemento respecto al gráfico (1.0 por defecto)
col= color colores
font= tipo de letra
las= label style
lty= line type - tipo de línea
lwd= line width - grosor de la línea
pch= el símbolo utilizado en los puntos
type= cómo se representan los datos

Opciones de puntos con pch=

También se puede utilizar cualquier símbolo con el siguiente código:

pch=as.character("#")

Opciones de línea con lty=

2.12.2.4 Leyendas

iris_means <- aggregate(iris[,1:4], by=list(iris$Species), FUN=mean)
iris_means
     Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        5.006       3.428        1.462       0.246
2 versicolor        5.936       2.770        4.260       1.326
3  virginica        6.588       2.974        5.552       2.026
barplot(Petal.Length ~ Group.1, data=iris_means,
        xlab="Species", ylab="Petal length",
        col=blues9)
legend(x="topleft", 
       legend=c("setosa", "versicolor", "virginica"),
       fill=blues9,
       title="Media del grupo")

2.12.2.5 Ejemplos

x <- rnorm(1000)
y <- x + rnorm(1000)
plot(x, y,
    main="Gráfico de dispersión",
    xlab="Valor en X", ylab="Valor en Y",
    xlim=c(-2,2), ylim=c(-5,5),
    pch=19, cex=1,
    col=sample(c("aquamarine4", 
                 "cadetblue",
                 "cyan4",
                 "lightblue3")),
)
abline(lm(x~y),
        lwd= 2, lty="1342",
        col = "darkblue")

plot(density(x), 
     main="Gráfico de densidad",
     col=4)                 # los números también represntan colores
lines(density(y),
     col="blue")

z <- rnorm(1000,1,0.2) + 4
head(z)
[1] 5.198223 4.935374 4.941418 4.960100 4.898786 5.158417
plot(x,y,
     main="Grupos en función de otra variable",
     sub="Colores y formas según la variable z",
     pch=z,
     col=z)

2.12.2.6 Representar gráficos en una matriz

par() sirve para definir los parámetros gráficos de una imagen (o device):

par(mfrow=c(2,2))           # matrix 2x2 en device
hist(iris$Petal.Length,
     breaks=10,
     col="cadetblue3")
plot(iris$Petal.Length,
     col="cadetblue3")
plot(iris$Sepal.Width,
     col="darkred")
boxplot(iris$Petal.Width,
        col="darkred", 
        main="Ancho del pétalo")

par(mfrow=c(1,1))           # resetea la imagen

2.12.2.7 Pie chart

cherry <- c(8,4,9,10,24,17)
names <- c("One", "Two", "Three", "Four", "Five", "Six")
pie(cherry,
    labels=names)

2.12.3 ggplot2

ggplot2 es parte de tidyverse; tiene tres elementos:

  1. Los datos en forma de data frame
  2. aesthetics, que relaciona formas y colores con los datos
  3. geoms, que especifican los elementos geométricos
medicos <- data.frame(id= c(seq(1:30)),
                      nota1= c(round(runif(30, min=0, max=10),2)),
                      nota2= c(round(runif(30, min=0, max=10),2)),
                      esp= sample(c(1,2,3), 30, replace = TRUE))
head(medicos)
  id nota1 nota2 esp
1  1  7.10  0.57   1
2  2  4.96  7.84   3
3  3  2.16  8.15   2
4  4  3.11  8.36   3
5  5  2.05  8.95   2
6  6  7.68  5.99   3
ggplot(data=medicos) +
    geom_point(aes(x=nota1, y=nota2),
                   col=medicos$esp, alpha=0.9,
                   shape=medicos$esp, size=2)

facet_wrap(~factor) sirve para separar los gráficos (facetarlos) en base a un criterio:

ggplot(data=medicos) +
    geom_point(aes(x=nota1, y=nota2),
                   col=medicos$esp + 15,
                   shape=medicos$esp + 15, size=4) +
    facet_wrap(~medicos$esp)

2.12.4 Ejemplos

b <- na.omit(subset(airquality, select=c(Solar.R, Temp, Month)))
ggplot(b) +
geom_point(aes(Temp, Solar.R, 
               pch=as.factor(Month), col=as.factor(Month))) + 
labs(pch="Months") +          # rotula esta leyenda
guides(col="none") +          # elimina la innecesaria
xlab("Temperature") + ylab("Solar radiation")

2.13 Glosario

2.13.1 rep()

Repite un elemento las veces que se especifique:

rep(1:3, 4, length.out=5)
[1] 1 2 3 1 2
1.
Chollet F. Deep learning with R. Second edition. Shelter Island: Manning; 2022.
2.
Gatto L. An Introduction to Machine Learning with R. 2020.
3.
Song Y, Millidge B, Salvatori T, Lukasiewicz T, Xu Z, Bogacz R. Inferring neural activity before plasticity as a foundation for learning beyond backpropagation. Nat Neurosci. 2024 Feb;27(2):348–58.
4.
Jones E, Harden S, Crawley MJ. The R book. Third edition. Hoboken, NJ: Wiley; 2022.
5.
Field A, Miles J, Field Z. Discovering statistics using R. Repr. Los Angeles, CA, USA: Sage; 2014.
6.
Yap BW, Sim CH. Comparisons of various types of normality tests. Journal of Statistical Computation and Simulation. 2011 Dec;81(12):2141–55.
7.
Perezgonzalez JD. Fisher, Neyman-Pearson or NHST? A tutorial for teaching data testing. Front Psychol. 2015 Mar;6:223.
8.
Lantz B. Machine learning with R: Learn techniques for building and improving machine learning models, from data preparation to model tuning, evaluation, and working with big data, fourth edition. 4th ed. Place of publication not identified: Packt Publishing; 2023.
9.
Carmona Pontaque F. Álgebra Matricial en Estadística. Análisis Multivariante. Fundació Universitat Oberta de Catalunya; 2024.
10.
Carmona Pontaque F. Modelos lineales. Ediciones de la Universidad de Barcelona; 2004.
11.
Faraway JJ. Linear models with R. Second edition. Boca Raton London: CRC Press, Taylor & Francis; 2014. (Texts in statistical science).