Diferencias con la interfaz de R: Es más ordenada y es más cómodo trabajar desde RStudio.
install.packages("ggplot2") library(ggplot2)
install.packages("devtools") library(devtools) install_github("author/package") github username/ nombre del paquete
install.packages("BiocManager") library(BiocManager) install("nombre del paquete", update=FALSE)
Todo lo que se manipula en R son objetos con diferentes tipos (o clases) de datos.
“<-” 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:
x <- "hola mundo" ## strings of characters
class(x)
## [1] "character"
y <- 3.14
class(y)
## [1] "numeric"
y <- 1:3
t <- 4L
class(y)
## [1] "integer"
class(t)
## [1] "integer"
x <- 1+3i
class(x)
## [1] "complex"
z <- 0 == 2
2>3
## [1] FALSE
3<2
## [1] FALSE
3<=8
## [1] TRUE
z
## [1] FALSE
class(z)
## [1] "logical"
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
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"
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
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"
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
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
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
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
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
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))
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
[] 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
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.
is.na(), complete.cases()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
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.
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
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
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.
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