1. Conociendo la interfaz

  1. Editor de código fuente
  2. Consola
  3. Historial y ambiente de trabajo
  4. Ventana de archivos, gráficas, paquetes, ayuda, etc.

Diferencias con la interfaz de R: Es más ordenada y es más cómodo trabajar desde RStudio.

Iniciando un proyecto en RStudio

  1. File/New Project.
  2. Símbolo de “create project”
  3. Click en nombre del proyecto y click en new project

2. Instalando paquetes

CRAN

install.packages("ggplot2") library(ggplot2)

GitHub

install.packages("devtools") library(devtools) install_github("author/package") github username/ nombre del paquete

Bioconductor

install.packages("BiocManager") library(BiocManager) install("nombre del paquete", update=FALSE)

3. Clases y tipos de objetos

Todo lo que se manipula en R son objetos con diferentes tipos (o clases) de datos.

Console input

“<-” es el operador de asignación

x <- 2+2
print(x)
## [1] 4
x
## [1] 4
msg <- "curso intensivo de R"
remove(msg, x)
msg = "curso intensivo de R 2" ; x <- 3+3
msg
## [1] "curso intensivo de R 2"

Las 5 clases atómicas de los objetos en R son las siguientes:

  1. Caracter
x <- "hola mundo" ## strings of characters
class(x)
## [1] "character"
  1. Numérico
y <- 3.14
class(y)
## [1] "numeric"
  1. Integrer (números enteros)
y <- 1:3
t <-  4L
class(y)
## [1] "integer"
class(t)
## [1] "integer"
  1. Complejo
x <- 1+3i
class(x)
## [1] "complex"
  1. Logico(TRUE/FALSE) Mayor qué, menor qué, igual que, mayor o igual qué, menor o igual qué, etc.
z <- 0 == 2
2>3
## [1] FALSE
3<2
## [1] FALSE
3<=8
## [1] TRUE
z
## [1] FALSE
class(z)
## [1] "logical"

Atributos de los objetos

Pueden formar parte de los objetos en R 1. Nombres, nombres de dimensiones 2. dimensiones (p.e matrices o tablas de datos) 3. Class (todos los objetos pertenecen a una clase) 4. Lenght (largo del objeto o comunmente vectores) 5. otros

attributes() : Permite acceder a los atributos de un objeto en R.

x <- 1
names(x) <- "juan"
attributes(x)
## $names
## [1] "juan"
x
## juan 
##    1

4. Vectores y listas

Vectores

Son el objeto más básico en R. Contiene múltiples copias de un tipo de objeto Se crean utilizando las siguientes funciones

c(): Concatena una serie de elementos

x <- c(1,2,3,4,5,6,7,8,9,10)
class(x)
## [1] "numeric"

vector(): Crea un vector de cierto tipo y cierto largo

y <- vector("numeric", 10)
z <- vector("logical", 10)

En un vector únicamente se pueden almacenar objetos de una misma clase. Cuando intentamos combinar objetos de diferentes clases, todos los objetos dentro del vector se vuelven de una misma clase según el denominador menos común

class(c(1.7, "a"))
## [1] "character"
class(c(TRUE, 2))
## [1] "numeric"
class(c("a", TRUE))
## [1] "character"

Coerción específica

Los objetos pueden cambiar de clase usando la función as.

x <- c(0,1,2,3,4,5,6)
class(x)
## [1] "numeric"
x <- as.logical(x)
x
## [1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
class(x)
## [1] "logical"
x <- as.character(x)
x
## [1] "FALSE" "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"  "TRUE"
class(x)
## [1] "character"
##NO SIEMPRE FUNCIONA
x <- c("a", "b", "c")
as.numeric(x)
## Warning: NAs introducidos por coerción
## [1] NA NA NA

listas

Son un tipo de vector con elementos de distintas clases

y <- list(1:3, "a", 3)
y
## [[1]]
## [1] 1 2 3
## 
## [[2]]
## [1] "a"
## 
## [[3]]
## [1] 3
class(y)
## [1] "list"

varios elementos en diferentes listas

c <- list(1:4, c("a", "d", "v"))

c
## [[1]]
## [1] 1 2 3 4
## 
## [[2]]
## [1] "a" "d" "v"
class(c)
## [1] "list"

5. Matrices y tablas de datos

Matrices

Las matrices son otros de los tantos tipos de objetos que existen en R. Se crean utilizando la función matrix(data, nrow, ncol)

m <- matrix(1:30, nrow = 5, ncol= 6)
m
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    6   11   16   21   26
## [2,]    2    7   12   17   22   27
## [3,]    3    8   13   18   23   28
## [4,]    4    9   14   19   24   29
## [5,]    5   10   15   20   25   30
m2 <- matrix(c(1,4,5,2,3,4,5,6,7,8,9,3), nrow = 6, ncol = 2)
m2
##      [,1] [,2]
## [1,]    1    5
## [2,]    4    6
## [3,]    5    7
## [4,]    2    8
## [5,]    3    9
## [6,]    4    3

Creando matrices utilizando un vector con la función dim()

m <- 1:10
dim(m) <- c(5,2)
m
##      [,1] [,2]
## [1,]    1    6
## [2,]    2    7
## [3,]    3    8
## [4,]    4    9
## [5,]    5   10

Creando matrices uniendo vectores con las funciones cbind() rbind()

x <- 1:3
y <- 10:12
matriz1 <- cbind(x, y) #datos en diferentes columnas
class(matriz1)
## [1] "matrix" "array"
matriz1
##      x  y
## [1,] 1 10
## [2,] 2 11
## [3,] 3 12
matriz2 <- rbind(x, y)#datos en diferentes filas
matriz2
##   [,1] [,2] [,3]
## x    1    2    3
## y   10   11   12

Tablas de datos (“DATA.FRAMES”)

Las tablas de datos son el objeto clave utilizado en R donde se almacena información tabulares. Se representan como un tipo especial de lista donde cada elemento de la lista tiene el mismo largo:

 -Columnas: Es el elemento
 -Filas: Es el largo de la lista.

Las columnas no precisamente tienen que ser de la misma clase (principal diferencia con una matriz). Las columnas guardan diferentes clases de objetos en cada columna.

Atributos de las tablas de datos

Nombre de las filas y las columnas. rownames() para las filas y colnames() names() para las columnas.

## FILAS
data <- mtcars
class(data)
## [1] "data.frame"
head(rownames(data))
## [1] "Mazda RX4"         "Mazda RX4 Wag"     "Datsun 710"       
## [4] "Hornet 4 Drive"    "Hornet Sportabout" "Valiant"
head(data)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
data2 <- airquality
head(rownames(data2))
## [1] "1" "2" "3" "4" "5" "6"
head(data2)
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 5    NA      NA 14.3   56     5   5
## 6    28      NA 14.9   66     5   6
## COLUMNAS
names(data)
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
colnames(data)
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"

Se puede crear una matriz de una tabla de datos con la función data.matrix() o con la función as.matrix(). Sin embargo, los elementos dentro de las tablas se verán forzados a convertirse a elementos de una misma clase.

data <- data.matrix(data)
head(data)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
class(data)
## [1] "matrix" "array"
y <- airquality
y <- as.matrix(y)
head(y)
##      Ozone Solar.R Wind Temp Month Day
## [1,]    41     190  7.4   67     5   1
## [2,]    36     118  8.0   72     5   2
## [3,]    12     149 12.6   74     5   3
## [4,]    18     313 11.5   62     5   4
## [5,]    NA      NA 14.3   56     5   5
## [6,]    28      NA 14.9   66     5   6
class(y)
## [1] "matrix" "array"

crear una tabla de datos

Se crean utilizando la función data.frame() y cada columna representaría un vector con objetos de una misma clase. Para ver el número de dimensiones se puede utilizar tambien ncol() y nrow().

z <- data.frame(sujeto=1:10, 
                respuesta=c(T,T,F,T,F,T,T,T,T,F))
z
##    sujeto respuesta
## 1       1      TRUE
## 2       2      TRUE
## 3       3     FALSE
## 4       4      TRUE
## 5       5     FALSE
## 6       6      TRUE
## 7       7      TRUE
## 8       8      TRUE
## 9       9      TRUE
## 10     10     FALSE
nrow(z)
## [1] 10
ncol(z)
## [1] 2

Otros objetos dentro de una tabla de datos

Como ya vimos, dentro de una tabla de datos podemos almacenar diferentes clases de objetos, sin embargo, existen objetos particulares dentro de las tablas, los factores y los valores perdidos.

factores Se trata de un tipo especial de vector para expresar datos categóricos. Muy útiles para crear grupos. Es mucho mejor que utilizar vectores integrers porque los factores se autodescriben. P.E, es mejor tener macho y hembra que 1 y 2.

Se crean con la función factor().

x <- factor(c("macho", "hembra", "hembra", "hembra", "macho"))
x
## [1] macho  hembra hembra hembra macho 
## Levels: hembra macho
table(x)
## x
## hembra  macho 
##      3      2
class(x)
## [1] "factor"
y <- 1:5
data.frame(y, x)
##   y      x
## 1 1  macho
## 2 2 hembra
## 3 3 hembra
## 4 4 hembra
## 5 5  macho

Quitar la clase del vector.

unclass(x)
## [1] 2 1 1 1 2
## attr(,"levels")
## [1] "hembra" "macho"

El orden de los niveles de los factores se puede establecer utilizando el argumento levels = dentro de la función factor(). P.E en modelos lineales el primer nivel puede ser la línea base.

x <- factor(c("enero", "febrero", "marzo", "abril"))
x
## [1] enero   febrero marzo   abril  
## Levels: abril enero febrero marzo
x <- factor(x, levels = c("enero", "febrero", "marzo", "abril"))
x
## [1] enero   febrero marzo   abril  
## Levels: enero febrero marzo abril

Sin embargo, supongamos que en el data frame tenemos dos grupos indicados como 1 y 2 para hombres y mujeres, entonces hacemos uso del argumento labels para ponerle nombre a cada uno de los grupos.

x <- c(rep(c(1,2), each= 10))
x
##  [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2
x <- factor(x, labels = c("mujeres", "hombres"))
x
##  [1] mujeres mujeres mujeres mujeres mujeres mujeres mujeres mujeres mujeres
## [10] mujeres hombres hombres hombres hombres hombres hombres hombres hombres
## [19] hombres hombres
## Levels: mujeres hombres
x <- c(rep(c(1,2), each= 10))
x <- factor(x, levels = c(2,1), labels = c("mujeres", "hombres"))
x
##  [1] hombres hombres hombres hombres hombres hombres hombres hombres hombres
## [10] hombres mujeres mujeres mujeres mujeres mujeres mujeres mujeres mujeres
## [19] mujeres mujeres
## Levels: mujeres hombres

valores perdidos En R son denominados como NA o NaN.

is.na() se utiliza para ver si hay valores perdidos o faltantes en un objeto

is.nan() evalua NaN, es decir cuando tenemos una operación aritmética indefinida o sin sentido

los valores NA también tienen una clase: Integrer NA, character NA, numeric NA, etc.

Un valor NaN es un valor NA, es decir, puede haber un valor NaN perdido y te sale NA, sin embargo al inverso no es posible

x <- c(1,2,NA,NA,NA,NA,3,4,5,6)
is.na(x)
##  [1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE
is.nan(x)
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
x <- c(1,2,NaN,NaN,NA,NA,3,4,5,6)
is.na(x)
##  [1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE
is.nan(x)
##  [1] FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

Atributo “NOMBRES”

Como vimos anteriormente, podemos nombrar objetos en R. Esto facilita la lectura del código porque de esta forma, los objetos se autodescriben. Se utiliza la función names() para asignarle nombre a los objetos

x <- 1:3
names(x)
## NULL
names(x) <- c("objeto", "cosa", "item")
x
## objeto   cosa   item 
##      1      2      3
names(x)
## [1] "objeto" "cosa"   "item"

Las listas también pueden tener nombres

x <- list(a=1:5, b=c(3,4,5,6,7), c=c("a", "b", "c", "d", "f"))
x
## $a
## [1] 1 2 3 4 5
## 
## $b
## [1] 3 4 5 6 7
## 
## $c
## [1] "a" "b" "c" "d" "f"

También se pueden asignar nombres a las matrices y tablas de datos con las funciones dimnames(),rownames(),colnames().

m <- matrix(sample(1:5),nrow = 6, ncol = 5)
m
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    2    5    4
## [2,]    3    2    5    4    1
## [3,]    2    5    4    1    3
## [4,]    5    4    1    3    2
## [5,]    4    1    3    2    5
## [6,]    1    3    2    5    4
dimnames(m) <- list(c("a","b","c", "d", "e", "f"), c("col1", "col2", "col3", "col4", "col5"))
m
##   col1 col2 col3 col4 col5
## a    1    3    2    5    4
## b    3    2    5    4    1
## c    2    5    4    1    3
## d    5    4    1    3    2
## e    4    1    3    2    5
## f    1    3    2    5    4
## añadir nombres utilizando las otras dos funciones
m <- matrix(rnorm(30), nrow = 6, ncol = 5)
m
##             [,1]       [,2]        [,3]       [,4]        [,5]
## [1,]  1.19493078 -1.1104143 -0.48427552 -0.5800915  1.44700727
## [2,] -0.49343480  1.8095221 -0.92521513  0.4540141  1.28356110
## [3,] -0.06989442 -0.9939002  1.56761455  0.6108493  1.03954592
## [4,] -0.84209368  0.9111204  1.45097531 -1.5436164  0.01191923
## [5,] -0.71287314 -1.3349513  1.35253607  0.2068776 -1.10703769
## [6,]  0.12125071  1.5287565 -0.09755564 -0.8920186  0.17855071
rownames(m) <- c("a","b","c", "d", "e", "f")
m
##          [,1]       [,2]        [,3]       [,4]        [,5]
## a  1.19493078 -1.1104143 -0.48427552 -0.5800915  1.44700727
## b -0.49343480  1.8095221 -0.92521513  0.4540141  1.28356110
## c -0.06989442 -0.9939002  1.56761455  0.6108493  1.03954592
## d -0.84209368  0.9111204  1.45097531 -1.5436164  0.01191923
## e -0.71287314 -1.3349513  1.35253607  0.2068776 -1.10703769
## f  0.12125071  1.5287565 -0.09755564 -0.8920186  0.17855071
colnames(m) <- c("col1", "col2", "col3", "col4", "col5")
m
##          col1       col2        col3       col4        col5
## a  1.19493078 -1.1104143 -0.48427552 -0.5800915  1.44700727
## b -0.49343480  1.8095221 -0.92521513  0.4540141  1.28356110
## c -0.06989442 -0.9939002  1.56761455  0.6108493  1.03954592
## d -0.84209368  0.9111204  1.45097531 -1.5436164  0.01191923
## e -0.71287314 -1.3349513  1.35253607  0.2068776 -1.10703769
## f  0.12125071  1.5287565 -0.09755564 -0.8920186  0.17855071

6. Leyendo y descargando tablas

Descargando archivos

Si queremos analizar alguna tabla de datos que esté dentro de una base de datos pública, podemos utilizar código en R para descargar el archivo sin necesidad de buscar la tabla y moverla manualmente a nuestro directorio. Para ello, etableceremos una serie de pasos a seguir para que todo te resulte mucho más sencillo.

1. verifica que estás en el directorio correcto de tu proyecto Para esto haremos uso de las funciones getwd() y setwd()

getwd() ##nos dice donde estamos
setwd("./data") ##nos movemos a otro lugar
setwd("../") ##nos movemos una carpeta arriba.

2. Crear un directorio en donde colocaremos nuestras tablas de datos descargadas Esto es más que nada para mantener limpieza dentro de nuestro directorio del proyecto. Se hace uso de la función dir.create()

if(!file.exists("data")){
     dir.create("data")
}

3. Obtener datos en línea Para esto haremos uso de la función download.file(). Parametros importantes: URL, destfile, method. Cuando tenemos un archivo ZIP

url <- "http://datosabiertos.salud.gob.mx/gobmx/salud/datos_abiertos/historicos/2021/01/datos_abiertos_covid19_28.01.2021.zip"
download.file(url, destfile = "./data/mexicocovid19.zip")
unzip("./data/mexicocovid19.zip", exdir = "./data")

Si Se tratara de un archivo csv el código sería de la siguiente forma

url2 <- "https://datos.cdmx.gob.mx/dataset/9c45ead6-9016-469a-b6ba-41e3660590cb/resource/c97a1898-5343-4b01-8d76-9f74e5b0d072/download/capacidad-hospitalaria_micrositio-base_micrositio.csv"
download.file(url2, destfile = "./data/capacidadcovid19CDMX.csv")

## Ver archivos en un directorio
list.files("./data")

De igual forma, si se trata de un archivo tipo excel, se guarda como ./directorio/nombredelarchivo.xlsx

Leyendo tablas de datos en R

Existen varias formas de leer archivos en R. En este caso nos enfocaremos en 3. La primera implica el uso de las funciones read.csv() y read.table() que se encuentran en el R base, mientras que la otra implica el uso del paquete xlsx para leer tablas en documentos de excel.

read.table() y read.csv()

read.table() nos permite leer archivos en formatos planos como el csv o txt. Esta función para leer tablas grandes (big data) causa problemas.

parametros importantes: na.strings, skip, stringsAsFactors, quote

data1 <- read.table("./data/capacidadcovid19CDMX.csv", sep = ",", header = TRUE)

read.csv() nos permite leer únicamente archivos en formato csv.

data2 <- read.csv("./data/capacidadcovid19CDMX.csv", stringsAsFactors = TRUE)

Para leer archivos de excel, hacemos uso del paquete xlsx y utilizamos la función read.xlsx(). Parametros importantes: sheetIndex,header,colindex,rowindex.

library(xlsx)
dataxlsx <- read.xlsx("./data/data.xlsx", sheetIndex = 1 , header = TRUE, rowIndex = 1:5, colIndex = c(1,3,5))

Convirtiendo tablas en archivos

Una vez que tengamos una tabla que hayamos creado nosotros podemos guardarla en diferentes formatos utilizando los comandos write.table(),write.xlsx().

##csv
write.table(x, file = "./directorio/nombre del archivo.csv", sep = ",")
##txt
write.table(x, file = "./directorio/nombre del archivo.txt", row.names = FALSE)
?write.table
##xlsx
library(xlsx)
write.xlsx(data, file="./data/data.xlsx")

La memoria requerida para leer una tabla de datos grande se calcula de la siguiente forma:

#filas  columas byte/objeto
x <- 1500000 * 120 * 8
x
## [1] 1.44e+09
x/10e8
## [1] 1.44

7. Extracción de información

Operadores básicos para extraer trozos de información de objetos en R

[] El corchete lo que hace es regresarnos un objeto de la misma clase que el objeto original, es decir, si extraes información de un vector, tendrás de regreso otro vector, si es una lista, obtendrás de regreso otra lista. Puede ser utilizado para seleccionar más de un elemento dentro de un objeto.

[[]] Doble corchete se utiliza para extraer generalmente elementos de una lista o tabla de datos. Extrae un elemento y la clase no necesariamente tiene que ser de la misma del objeto original.

$ Extrae elementos de una lista o dataframe utilizando el nombre del elemento a extraer, puede o no ser de la misma clase que el objeto original

extrayendo de un vector

x <- rnorm(100, 2,4)
x[3]
## [1] 6.413041
x[1:10] ## una serie de elementos
##  [1]  2.360921 -1.896764  6.413041  7.361714  6.102968 -4.478480  5.257225
##  [8]  3.383377  3.879597  8.819829
x[c(3,5,8,9,15)] ## elementos específicos
## [1]  6.413041  6.102968  3.383377  3.879597 -2.836336
y <- c("a","r","t","g","e","d","j","ñ")
y[5]
## [1] "e"
y[y>"a"]
## [1] "r" "t" "g" "e" "d" "j" "ñ"
z <- y>"a" ## ojo, no son lo mismo
y[z]
## [1] "r" "t" "g" "e" "d" "j" "ñ"
which(x>=3)
##  [1]  3  4  5  7  8  9 10 14 17 20 21 25 26 28 35 41 43 44 45 47 49 51 64 66 71
## [26] 73 78 81 82 83 84 85 88 90 91 93 95
x[which(x>3)]
##  [1]  6.413041  7.361714  6.102968  5.257225  3.383377  3.879597  8.819829
##  [8]  5.359225  5.225605  9.128192  3.638217  9.022768  6.066940  4.103367
## [15]  8.343320  3.970485  3.949824  4.533100  6.568970  5.581381  6.512293
## [22]  3.593136  5.633170  4.588584  3.811461  6.784316  3.090690 11.736605
## [29]  9.293164  5.629227  8.244545  3.875361  4.473263  5.536686  7.142564
## [36]  7.859810 13.898805

Extrayendo de una lista Podemos utilizar los 3 operadores anteriormente mencionados para extraer elementos de una lista. Podemos extraer por nombre o por número de elemento de la lista.

lista <- list(data=matrix(1:30, 6, 5), matriz=head(as.matrix(airquality), 20), vector1=rnorm(10))
head(lista)
## $data
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    7   13   19   25
## [2,]    2    8   14   20   26
## [3,]    3    9   15   21   27
## [4,]    4   10   16   22   28
## [5,]    5   11   17   23   29
## [6,]    6   12   18   24   30
## 
## $matriz
##       Ozone Solar.R Wind Temp Month Day
##  [1,]    41     190  7.4   67     5   1
##  [2,]    36     118  8.0   72     5   2
##  [3,]    12     149 12.6   74     5   3
##  [4,]    18     313 11.5   62     5   4
##  [5,]    NA      NA 14.3   56     5   5
##  [6,]    28      NA 14.9   66     5   6
##  [7,]    23     299  8.6   65     5   7
##  [8,]    19      99 13.8   59     5   8
##  [9,]     8      19 20.1   61     5   9
## [10,]    NA     194  8.6   69     5  10
## [11,]     7      NA  6.9   74     5  11
## [12,]    16     256  9.7   69     5  12
## [13,]    11     290  9.2   66     5  13
## [14,]    14     274 10.9   68     5  14
## [15,]    18      65 13.2   58     5  15
## [16,]    14     334 11.5   64     5  16
## [17,]    34     307 12.0   66     5  17
## [18,]     6      78 18.4   57     5  18
## [19,]    30     322 11.5   68     5  19
## [20,]    11      44  9.7   62     5  20
## 
## $vector1
##  [1]  0.049224555  0.004067578 -1.645419739  0.083211462  0.431517620
##  [6]  0.968979288  0.818217553 -1.288505876  1.091765794 -0.440090319
lista["data"]
## $data
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    7   13   19   25
## [2,]    2    8   14   20   26
## [3,]    3    9   15   21   27
## [4,]    4   10   16   22   28
## [5,]    5   11   17   23   29
## [6,]    6   12   18   24   30
lista[["matriz"]]
##       Ozone Solar.R Wind Temp Month Day
##  [1,]    41     190  7.4   67     5   1
##  [2,]    36     118  8.0   72     5   2
##  [3,]    12     149 12.6   74     5   3
##  [4,]    18     313 11.5   62     5   4
##  [5,]    NA      NA 14.3   56     5   5
##  [6,]    28      NA 14.9   66     5   6
##  [7,]    23     299  8.6   65     5   7
##  [8,]    19      99 13.8   59     5   8
##  [9,]     8      19 20.1   61     5   9
## [10,]    NA     194  8.6   69     5  10
## [11,]     7      NA  6.9   74     5  11
## [12,]    16     256  9.7   69     5  12
## [13,]    11     290  9.2   66     5  13
## [14,]    14     274 10.9   68     5  14
## [15,]    18      65 13.2   58     5  15
## [16,]    14     334 11.5   64     5  16
## [17,]    34     307 12.0   66     5  17
## [18,]     6      78 18.4   57     5  18
## [19,]    30     322 11.5   68     5  19
## [20,]    11      44  9.7   62     5  20
## ver la clase de los objetos extraidos
class(lista["data"])
## [1] "list"
class(lista[["matriz"]])
## [1] "matrix" "array"
##----------
lista$vector1
##  [1]  0.049224555  0.004067578 -1.645419739  0.083211462  0.431517620
##  [6]  0.968979288  0.818217553 -1.288505876  1.091765794 -0.440090319
##sinónimos
lista[c("data","vector1")]; lista[c(1,3)]
## $data
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    7   13   19   25
## [2,]    2    8   14   20   26
## [3,]    3    9   15   21   27
## [4,]    4   10   16   22   28
## [5,]    5   11   17   23   29
## [6,]    6   12   18   24   30
## 
## $vector1
##  [1]  0.049224555  0.004067578 -1.645419739  0.083211462  0.431517620
##  [6]  0.968979288  0.818217553 -1.288505876  1.091765794 -0.440090319
## $data
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    7   13   19   25
## [2,]    2    8   14   20   26
## [3,]    3    9   15   21   27
## [4,]    4   10   16   22   28
## [5,]    5   11   17   23   29
## [6,]    6   12   18   24   30
## 
## $vector1
##  [1]  0.049224555  0.004067578 -1.645419739  0.083211462  0.431517620
##  [6]  0.968979288  0.818217553 -1.288505876  1.091765794 -0.440090319
##sinónimos
lista[[c(3,5)]]
## [1] 0.4315176
lista[[3]][[5]]
## [1] 0.4315176
lista[[3]][5]
## [1] 0.4315176
lista$vector1[5]
## [1] 0.4315176
##concordancia parcial
lista$d 
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    7   13   19   25
## [2,]    2    8   14   20   26
## [3,]    3    9   15   21   27
## [4,]    4   10   16   22   28
## [5,]    5   11   17   23   29
## [6,]    6   12   18   24   30
lista[["d", exact=FALSE]]
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    7   13   19   25
## [2,]    2    8   14   20   26
## [3,]    3    9   15   21   27
## [4,]    4   10   16   22   28
## [5,]    5   11   17   23   29
## [6,]    6   12   18   24   30

extrayendo de una matriz o tabla de datos Podemos extraer información de las tablas de datos utilizando los siguientes subíndices [i,j] donde i = filas y j = columnas

data1[1,3]
## [1] "EDOMEX"
data1[1,]
##        Fecha              Nombre_hospital Institucion
## 1 2020-06-13 HOSPITAL GENERAL DE AXAPUSCO      EDOMEX
##   Estatus_capacidad_hospitalaria Estatus_capacidad_UCI          Coordenadas
## 1                       Crítica              Crítica 19.732872,-98.769445
data1[c(3,5,7), 1:3]
##        Fecha                                                  Nombre_hospital
## 3 2020-06-13 HOSPITAL GENERAL VALLE DE CHALCO "DR. FERNANDO QUIROZ GUTIERREZ"
## 5 2020-06-13                                       HOSPITAL GENERAL DE CHALCO
## 7 2020-06-13                                 HOSPITAL GENERAL DE CHIMALHUACAN
##   Institucion
## 3      EDOMEX
## 5      EDOMEX
## 7      EDOMEX
## Columnas
head(data1[,3])
## [1] "EDOMEX" "EDOMEX" "EDOMEX" "EDOMEX" "EDOMEX" "EDOMEX"
head(data1$Estatus_capacidad_UCI)
## [1] "Crítica" "Buena"    "Buena"    "Buena"    "Buena"    "Buena"
head(data1[data1$Institucion == "EDOMEX",])
##        Fecha                                                  Nombre_hospital
## 1 2020-06-13                                     HOSPITAL GENERAL DE AXAPUSCO
## 2 2020-06-13               HOSPITAL GENERAL AMECAMECA "VALENTIN GOMEZ FARIAS"
## 3 2020-06-13 HOSPITAL GENERAL VALLE DE CHALCO "DR. FERNANDO QUIROZ GUTIERREZ"
## 4 2020-06-13       HOSPITAL GENERAL TEXCOCO "GUADALUPE VICTORIA" BICENTENARIO
## 5 2020-06-13                                       HOSPITAL GENERAL DE CHALCO
## 6 2020-06-13                     HOSPITAL GENERAL DE IXTAPALUCA "PEDRO LOPEZ"
##   Institucion Estatus_capacidad_hospitalaria Estatus_capacidad_UCI
## 1      EDOMEX                       Crítica              Crítica
## 2      EDOMEX                          Buena                 Buena
## 3      EDOMEX                          Buena                 Buena
## 4      EDOMEX                          Media                 Buena
## 5      EDOMEX                          Media                 Buena
## 6      EDOMEX                          Buena                 Buena
##            Coordenadas
## 1 19.732872,-98.769445
## 2 19.144883,-98.785072
## 3 19.273775,-98.941609
## 4 19.514309,-98.871750
## 5 19.268265,-98.893965
## 6 19.318829,-98.855366
head(data1[data1$Institucion == "EDOMEX", c(1,5)])
##        Fecha Estatus_capacidad_UCI
## 1 2020-06-13              Crítica
## 2 2020-06-13                 Buena
## 3 2020-06-13                 Buena
## 4 2020-06-13                 Buena
## 5 2020-06-13                 Buena
## 6 2020-06-13                 Buena
head(data1[data1$Institucion == "EDOMEX", 
           c("Fecha","Institucion","Estatus_capacidad_UCI")])
##        Fecha Institucion Estatus_capacidad_UCI
## 1 2020-06-13      EDOMEX              Crítica
## 2 2020-06-13      EDOMEX                 Buena
## 3 2020-06-13      EDOMEX                 Buena
## 4 2020-06-13      EDOMEX                 Buena
## 5 2020-06-13      EDOMEX                 Buena
## 6 2020-06-13      EDOMEX                 Buena

Extrayendo y eliminando valores perdidos

Por lo general queremos eliminar aquellos valores NA que en realidad no aportan información a nuestra tabla. Por lo que existen muchas formas de identificar y eliminar valores perdidos en una tabla de datos, matriz o un vector.

  1. Primero identificamos si existen valores perdidos, utilizando las funciones is.na(), complete.cases()
  2. Eliminarlos directamente utilizando la función na.omit()

Pasos a seguir

## 1 Identificando los valores NA.
head(complete.cases(airquality))
## [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE
head(is.na(airquality))
##      Ozone Solar.R  Wind  Temp Month   Day
## [1,] FALSE   FALSE FALSE FALSE FALSE FALSE
## [2,] FALSE   FALSE FALSE FALSE FALSE FALSE
## [3,] FALSE   FALSE FALSE FALSE FALSE FALSE
## [4,] FALSE   FALSE FALSE FALSE FALSE FALSE
## [5,]  TRUE    TRUE FALSE FALSE FALSE FALSE
## [6,] FALSE    TRUE FALSE FALSE FALSE FALSE
sum(complete.cases(airquality))
## [1] 111
nrow(airquality)
## [1] 153
sum(is.na(airquality))
## [1] 44
sum(!is.na(airquality))
## [1] 874
## 2 eliminando los valores NA de una tabla o matriz
head(airquality[complete.cases(airquality),],10)
##    Ozone Solar.R Wind Temp Month Day
## 1     41     190  7.4   67     5   1
## 2     36     118  8.0   72     5   2
## 3     12     149 12.6   74     5   3
## 4     18     313 11.5   62     5   4
## 7     23     299  8.6   65     5   7
## 8     19      99 13.8   59     5   8
## 9      8      19 20.1   61     5   9
## 12    16     256  9.7   69     5  12
## 13    11     290  9.2   66     5  13
## 14    14     274 10.9   68     5  14
### !is.na funciona mejor con vectores
## vectores
head(airquality$Solar.R[!is.na(airquality$Solar.R)])
## [1] 190 118 149 313 299  99
head(airquality[!is.na(airquality$Solar.R),"Solar.R"])
## [1] 190 118 149 313 299  99
## tabla de datos sin NA utilizando !is.na
head(airquality[!is.na(airquality$Solar.R),])
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 7    23     299  8.6   65     5   7
## 8    19      99 13.8   59     5   8
## O bien con la función na.omit
head(na.omit(airquality))
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 7    23     299  8.6   65     5   7
## 8    19      99 13.8   59     5   8

8. Estructuras básicas de Control

Cuando queremos establecer un programa dentro de R (escribir un código para que haga algo), existen ciertas estructuras que nos ayudan a controlar este flujo. Estas expresiones no se escriben dentro de un comando o función, al contrario, las funciones se escriben dentro de estas estructuras o cuando nosotros creamos una función.

if else

Nos ayuda a establecer y evaluar condiciones de tipo lógico, si la condición es verdadera, entonces el programa hace algo. if evalua una condición inicial, si esta condición es falsa, entonces else hace otra cosa. Es decir, si(if) tengo una condición A que es verdadera, ocurre algo, de otro modo (else) si A es falsa, ocurre otra cosa.

x <- 11

if (x>=10){
  y <- 1+1
} else {
  y <- 1+2
}

  
if (x>=10){y <- 1+1} else {y <- 1+2}
y
## [1] 2
x <- 5
if (x<10){y <- 2+2}
y
## [1] 4

Bucle for

Es el operador para bucles más común. La idea es tener un indice de búcle i (podemos tener más de un índice de blucle j,l,k,etc.). que cubre una secuencia de números enteros (integrer), números específicos, etc.

x <- vector("numeric", 20)
for (i in 1:20) {
     x[i] <- 2+i
}

x <- vector("numeric", 20)
for (i in c(1,5,7,8)) {
     x[i] <- 2+i
}
x
##  [1]  3  0  0  0  7  0  9 10  0  0  0  0  0  0  0  0  0  0  0  0

Se pueden anidar los bucles for. Por ejemplo entre filas y columnasde una tabla.

x <- matrix(1:15, 5, 3)
x
##      [,1] [,2] [,3]
## [1,]    1    6   11
## [2,]    2    7   12
## [3,]    3    8   13
## [4,]    4    9   14
## [5,]    5   10   15
for (i in 1:5) {
     for (j in 1:3) {
          print(x[i,j])
     }
}
## [1] 1
## [1] 6
## [1] 11
## [1] 2
## [1] 7
## [1] 12
## [1] 3
## [1] 8
## [1] 13
## [1] 4
## [1] 9
## [1] 14
## [1] 5
## [1] 10
## [1] 15

bucle while

Toma una expresión lógica y ejecuta un loop (búcle) basado en el valor de esa expresión lógica. Si la condición es verdadera se ejecuta el loop, una vez ejecutada, la condición es evaluada de nuevo, si es cierta, se vuelve a repetir el loop. podemos tener más de una condición dentro del bucle while

x <- 5
while (x>3 & x<10) {
     x <- x+.5
}
x
## [1] 10

En esta condición el loop se detiene cuando alguna de las dos condiciones establecidas dejan de ser verdaderas, es decir, cuando X llega a 3 o llega a 10 el loop se detiene.

Hay que tener cuidado porque podemos crear un loop infinito.

next y break

Interrumpen el flujo de un programa. Por ejemplo si tenemos un código y dentro de ese código hay un loop y dentro de ese loop tenemos una condición que dé como resultado break o Next, lo que harán será romper el loop y pasar a la siguiente parte del código.

#BREAK
x <- 1:5
for (val in x) {
  if (val == 3){
    break
    }
  print(val)
  }
## [1] 1
## [1] 2
#NEXT
x <- 1:5
for (val in x) {
  if (val == 3){
    next
    }
  print(val)
  }
## [1] 1
## [1] 2
## [1] 4
## [1] 5