c(1,2,3)[1] 1 2 3a <- c("a", 1, 1.5)
print(a)[1] "a"   "1"   "1.5"is.vector(a)[1] TRUESe 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 pkgal ambiente | 
| detach("package:pkg", unload = TRUE) | elimina el paquete del ambiente | 
| search() | lista los paquetes cargados y archivos del ambiente | 
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" ))| getwd() | devuelve el directorio de trabajo | 
| setwd() | cambia el directorio de trabajo | 
read.csv()data <- read.csv("file.csv",
          header = FALSE, 
          sep = ","
        )readr::read_csv()readxl::read_excel() para .xlswrite.table() a .txt, especificando separadorwrite.csv()xlsx::write.xlsx()foreign::write.foreign("data", "file.spss", package="SPSS") (también exporta de SAS y otros programas estadísticos)c(1,2,3)[1] 1 2 3a <- c("a", 1, 1.5)
print(a)[1] "a"   "1"   "1.5"is.vector(a)[1] TRUEx <- c("A", "B", "B", "A", "A")
x <- as.factor(x)
print(x)[1] A B B A A
Levels: A Blevels(x) <- c("Anna", "Bob")
print(x)[1] Anna Bob  Bob  Anna Anna
Levels: Anna Bobbin <- 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 Hombredatos <- 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 | 
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.5El índice empieza en 1 (no en 0); se indexa con corchetes o dobles corchetes
x[1]
# "Text"
x[[2]][1]
# 10Para 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| 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] | 
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
)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)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 iif (x == 2) {
    print("Just right")
} else if (x >= 5) {
    print("Too high") 
} else {
    print("Too low")
}if(x == 2){print("Just right")}for (i in 1:length(df)) {
    if (df$var1[i] < 30) {
        print(i)
    }
}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"| 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 | 
lapply y sapplylapply() 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 aggregateSubdivide 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.016667plot(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.026table() - frecuencias absolutasprop.table(data) - frecuencias relativasknitr::kable() y knitr::kables() - markdownPasando 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 2set.seed() permite especificar una “semilla” para el generador de números aleatorio.
runif()runif(n = n,
      min = min, 
      max = max)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úmerossample(1:6, 10, replace = TRUE,
       prob = c(1, 1, 1, 1, 6, 1)) [1] 5 4 5 5 3 2 5 5 5 2replicate()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.72102Requiere 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)
| 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 | 
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.1556496la función de probabilidad para \(P(X \le 8)\) con pbinom()
pbinom(8, 9, 0.7)[1] 0.9596464plot(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 6plot(table(rbinom(10000, 9, 0.7)),
     main = "10.000 casos simulados",
     xlab = "x",
     ylab = "Número de casos")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().
Existen opciones para muchos formatos:
| pdf("file.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")plotLa 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 | 
stem()hist()boxplot()pairs() - analiza las variables entre sí por parejasbarplot()pie()persp()| 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 | 
Se pueden añadir capas de datos a los gráficos
lines() - añade líneas entre puntosabline() - añade una pendiente al gráficopoints() - añade puntos al gráficolegend()text()grid() - en el fondotitle()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 | 

pch=También se puede utilizar cualquier símbolo con el siguiente código:
pch=as.character("#")
lty=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.026barplot(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")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.158417plot(x,y,
     main="Grupos en función de otra variable",
     sub="Colores y formas según la variable z",
     pch=z,
     col=z)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 imagencherry <- c(8,4,9,10,24,17)
names <- c("One", "Two", "Three", "Four", "Five", "Six")
pie(cherry,
    labels=names)ggplot2ggplot2 es parte de tidyverse; tiene tres elementos:
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   3ggplot(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)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")rep()Repite un elemento las veces que se especifique:
rep(1:3, 4, length.out=5)[1] 1 2 3 1 2