Introducción

Archivos

Existen varias maneras de trabajar con R, entre ellas se encuentran:

  • Línea de comandos donde es importante saber que cuando ejecutamos alguna sentencia pueden presentarse tres colores:
    • sentencias = azul
    • warnings = rojo
    • resultados = negro
  • Scripts permiten preparar un código más extenso, en ellos, “se corren” los comandos con las teclas Ctrl+Enter o con el botón “Run”
    Así mismo se pueden situar comentarios entre el codigo por medio de #, esto quiere decir que son instrucciones que no se van a ejecutar
2+2 #Esto es un comentario
## [1] 4
  • Rmarkdown para crear documentos tipo informes que pueden ser exportados finalmente como archivos .pdf, .htm o .doc
    . El presente documento es un Rmarkdown
    Este tipo de archivos permite la introducción de chunks , es decir lineas de código no solo de R sino que de otros lenguajes de programación como Python o SQL, entre otros. Además de premitir ingresar el código, se puede definir como se va mostrar:
    • Mostrar código y sus resultados.
    • Mostrar unicamente el código
    • Correr el código pero no mostrar nada
    • No mostrar nada ni ejecutar el código.
    Otra caracteristica especial de este tipo de archivos es su estructura. Al prinicipio del documento se encuentra el YAML que entre otras cosas puede contener el título, la fecha, que tipo de archivo de salida y a veces cuestiones ésteticas del documento.
    Específicamente si el archivo de salida es HTML existe la posibilidad de personalizar el documento de salida con un poco de lenguaje CSS y Java Script el cual permite modificar cuestiones como:
    • Tipografía
    • Colores
    • Fondo
    • Entre otros

Básicos

En general, para guardar y asignar valores se usa <- (flecha)

suma<-2+2 
suma
## [1] 4

en este caso el resultado de la suma “2+2” se almacenó con el nombre de suma, con ella se pueden realizar más operaciones. La asignación aplica para otros elementos como vectores, matrices, dataframes y otros

suma+2
## [1] 6
xyy<-6
yyz<-rep(12,4) # rep(obj, num de repeticiones) es una función de repetición
EQUIS<-c(1:10) #c() sirve para concatenar, en este caso 1:10 se refiere a una secuencia de numeros
hola<-c("buen","dia","22") #listas, cada palabra/numero entre comillado es un elemento

EQUIS
##  [1]  1  2  3  4  5  6  7  8  9 10
hola
## [1] "buen" "dia"  "22"

Si existe cualquier duda sobre alguna función, algún argumento o incluso alguna librería se puede buscar en la ventana de Help o bien por medio de los siguientes comandos

help("solve") #la función está entrecomillada
?solve #signo de interrogación cerrado

En el caso de no estar segura de la escritura de la función podemos usar el siguiente comando

apropos ("sequ") #apropos es una función que te da funciones aproximadas o con nombre parecidos
## [1] "sequence"         "sequence.default"

Si bien como se verá más adelante podemos crear nuestras propias funciones, en ocasiones existen paqueterías o librerías que ya han sido creadas y que contienen diversas funciones para un sin de propósitos, en este curso se ha hecho uso principalmente de las librerías de tidyverse para un manejo más fluido de los data frames, de lubridate para el manejo del formato de fechas y horas, y ggplot2 para la creación de mejores gráficos. Para el uso de dichas liberías primero se tienen que instalar y luego activar con los sisguientes dos comandos

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

Calculadora

Con R podemos hacer operaciones básicas como:

2+2 #suma
## [1] 4
5-3 #resta
## [1] 2
3*8 # multiplicación "escalar"
## [1] 24
3^2 # elevar a una potencia
## [1] 9

De manera similar podemos realizar operaciones con vectores como punto vector de manera que cada elemento del vector se multiplica por el escalar

Vect1<-c(1,2,5,9,10,3)
Vect1
## [1]  1  2  5  9 10  3
Vect1*5
## [1]  5 10 25 45 50 15

Vectores

Si bien ya se había mencionado el concepto de vectores no se habían definidio, y es que un vector es la estructura más sencilla en R, es una colección de uno o más datos del mismo tipo.

Vector1<- c(10,12,1,2,8,9,5,5)
Vector2<-c("a","b","c")

Son unidimensionales, unicamente tiene largo (número de elementos)

length(Vector1)
## [1] 8
length(Vector2)
## [1] 3

para verificar si es vector podemos usar la función is.vector

is.vector(Vector1)
## [1] TRUE

De hecho podemos hacer ese tipo de preguntas informativas para varios objetos de r
is.data.frame()
is.numeric()
is.factor()
is.matrix()


Matrices

¿Qué son y cómo se hacen?

Las matrices son un tipo de objeto que R maneja, son un conjunto de elementos del mismo tipo organizado en filas y columnas
Para su creación se usa el comando matrix

cadena<- c(5,7,3,9,1,12,6,7,10,12,1,2,8,9,5,5)
Mr<-matrix(cadena,ncol=4,byrow=TRUE) 
Mr
##      [,1] [,2] [,3] [,4]
## [1,]    5    7    3    9
## [2,]    1   12    6    7
## [3,]   10   12    1    2
## [4,]    8    9    5    5
Mc<-matrix(cadena,ncol=4,byrow=FALSE)
Mc
##      [,1] [,2] [,3] [,4]
## [1,]    5    1   10    8
## [2,]    7   12   12    9
## [3,]    3    6    1    5
## [4,]    9    7    2    5

Los argumentos de dicha función son
* data= c(conjunto de numeros separados por comas o secuencia creada) o bien un vectore previamente creado
* nrow= y ncol= se puede presindir de alguno de los dos y hacen referencia al número de columnas o de renglones de la matriz
* byrow= indica si el llenado es por filas o no
Adicionalmente existe la posibilidad de incorporar más elemento a la matriz con rbind() y cbind()

mas<-c(5,6)
Mr2<-cbind(Mr,mas)
Mr2
##                mas
## [1,]  5  7 3 9   5
## [2,]  1 12 6 7   6
## [3,] 10 12 1 2   5
## [4,]  8  9 5 5   6

Para conocer las dimensiones de la matriz:

dim(Mc) #renglones columnas
## [1] 4 4

Posición y selección

Para seleccionar elementos d euna matriz se utilizan los corchetes [ ]

Mc
##      [,1] [,2] [,3] [,4]
## [1,]    5    1   10    8
## [2,]    7   12   12    9
## [3,]    3    6    1    5
## [4,]    9    7    2    5
Mc[1,3] #un solo elemento, son como coordenadas
## [1] 10
Mc[,3] #todos los elementos de la columna 3
## [1] 10 12  1  2
Mc[2,] #todas los elementos del renglon 2
## [1]  7 12 12  9
Mc[1:2,] #todas las columnas de un rango de filas
##      [,1] [,2] [,3] [,4]
## [1,]    5    1   10    8
## [2,]    7   12   12    9
Mc[-1,-1] #todas las columnas y filas menos las indicadas
##      [,1] [,2] [,3]
## [1,]   12   12    9
## [2,]    6    1    5
## [3,]    7    2    5
Mc[,c(1,4)] #solo las columnas seleccionadas
##      [,1] [,2]
## [1,]    5    8
## [2,]    7    9
## [3,]    3    5
## [4,]    9    5
#Mc[1,5] elemento fuera de la matriz

Algrebra de matrices

Operaciones

Siendo A la siguiente matriz

cadena<- c(5,7,3,9,1,12,6,7,10,12,1,2,8,9,5,5)
A<-matrix(cadena,ncol=4,byrow=FALSE)
A
##      [,1] [,2] [,3] [,4]
## [1,]    5    1   10    8
## [2,]    7   12   12    9
## [3,]    3    6    1    5
## [4,]    9    7    2    5

Se puede obtener la transpuesta , es decir \(A^T\), que se obtiene reflejnado los elementos a lo largo de su diagonal

t(A)
##      [,1] [,2] [,3] [,4]
## [1,]    5    7    3    9
## [2,]    1   12    6    7
## [3,]   10   12    1    2
## [4,]    8    9    5    5

También se puede obtener la inversa es decir \(A^{-1}\), que se obtiene unicamente de las matrices cuadradas y que cumple con \(A^{-1} \cdot A= A \cdot A^{-1} = I\) donde I se refiere a la matriz identidad.

Am<-solve(A)
Am
##              [,1]        [,2]        [,3]        [,4]
## [1,]  0.016031350 -0.03028144 -0.14535091  0.17420734
## [2,] -0.106163164  0.08941931  0.02921268 -0.02030638
## [3,]  0.009975062  0.09226933 -0.15710723 -0.02493766
## [4,]  0.115781974 -0.10758817  0.28357677 -0.07516922

Para comprobar la matriz transpuesta se realiza una multiplicación de matrices la cual esta dada por el operador %*%

A%*%Am
##              [,1]         [,2]          [,3]         [,4]
## [1,] 1.000000e+00 1.110223e-16 -4.440892e-16 0.000000e+00
## [2,] 2.220446e-16 1.000000e+00 -4.440892e-16 4.440892e-16
## [3,] 1.110223e-16 0.000000e+00  1.000000e+00 1.110223e-16
## [4,] 0.000000e+00 0.000000e+00  2.220446e-16 1.000000e+00
round(x = A%*%Am,digits = 0) #en este caso se usa la función round() para redondear los decimales de la multiplicación
##      [,1] [,2] [,3] [,4]
## [1,]    1    0    0    0
## [2,]    0    1    0    0
## [3,]    0    0    1    0
## [4,]    0    0    0    1

Aplicaciones Esto es particularmente útil para la solución de sistemas de ecuaciones . Por ejemplo:

\[\begin{equation} \begin{split} 5x-3y+2z & = 1\\ -2x+2y-z & = 5\\ 4x+2y-4z & = -3\\ \end{split} \end{equation}\]

coeficientes<- matrix(c(5,-3,2,-2,2,-1,4,2,-4), byrow = TRUE, ncol=3)
coeficientes
##      [,1] [,2] [,3]
## [1,]    5   -3    2
## [2,]   -2    2   -1
## [3,]    4    2   -4
respuestas<- c(1,5,-3)
respuestas
## [1]  1  5 -3

PRIMERA SOLUCION

ainv<-solve(coeficientes)
solve(coeficientes,respuestas)
## [1] 2.388889 8.611111 7.444444

SEGUNDA SOLUCION

ainv%*%respuestas 
##          [,1]
## [1,] 2.388889
## [2,] 8.611111
## [3,] 7.444444

Bases de Datos y Funciones

Las bases de datos o dataframes son estructuras de datos de dos dimensiones (rectangulares) que pueden contener distintos tipos de datos. Cada renglón representa un caso u observación y cada calumna representauna variable o atributos.
Si bien dentro de R están incluidos diversos data frames que son llamados por medio de su nombre (Ej: iris)

Iristres<-iris3

También existe la posibilidad de cargar nuestras propias bases de datos en formatos como .xlsx o .csv si el archivo esta en xlsx se requiere de la libreria readxl que funciona muy similar a **read.csv*

BD_EXCEL<-read_excel("ruta del archivo\\nombre del archivo.xlsx",sheet = "nombre de la hoja",)
BD_CSV<-read.csv("ruta del archivo\\nombre del archivo.csv") #se pueden establecer otros argumentos, como los encabezados, los separadores, si hay que slatarse filas, etc...

Iris y funciones básicas

Esta base de datos contiene las medidas en centrimetro de longitud y anchura de los sépalos y petalos para tres especies de iris.

Iris<-iris
dim(Iris)
## [1] 150   5
head(Iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

Con esta información podemos sacar promedios, desviación estandar, etc por ejemplo

mean(Iris[,1])
## [1] 5.843333
sd(Iris[,1])
## [1] 0.8280661

Como esta base esta clasificada por especie podemos sacad el promedio para una especie específica

prom_virgi<-apply(iris[101:150,-5],2,mean) #la función apply() masifica las funciones
print(prom_virgi)
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##        6.588        2.974        5.552        2.026

Censo 2020 y resumenes de información

Con la información del censo de población y vivienda del año 2020 para el estado de Aguscalientes se obtendrá información específica

datos10<- read_excel("datos_ags_estado_2020.xlsx", sheet = "Hoja1", range = "A1:HV481", na=c("*","N/D"))

Por ejeMplo, se puede obtener la Información de la proporción de mujeres por municipio

tabla1<-aggregate(cbind(as.numeric(POBTOT),as.numeric(POBFEM),as.numeric(POBMAS) )~NOM_MUN, #la función aggregate() crea un resumen de un subconjunto de información
          data=datos10,sum)
prop_fem<-tabla1$V2/tabla1$V1 #operacion
tabla2<-data.frame(tabla1,prop_fem=prop_fem)
names(tabla2)=c("NOM_MUN","POBTOT","POBFEM","POBMAS","PROP_FEM")
tabla2
##                      NOM_MUN POBTOT POBFEM POBMAS  PROP_FEM
## 1             Aguascalientes 901446 463697 437749 0.5143924
## 2                   Asientos  17760   9087   8673 0.5116554
## 3                   Calvillo  28367  14561  13806 0.5133077
## 4                      Cosío   8477   4410   4067 0.5202312
## 5                   El Llano   6307   3219   3088 0.5103853
## 6                Jesús María  97524  49513  48011 0.5077007
## 7        Pabellón de Arteaga  35351  18046  17305 0.5104806
## 8            Rincón de Romos  42556  21748  20808 0.5110443
## 9  San Francisco de los Romo  46196  23331  22865 0.5050437
## 10        San José de Gracia   5607   2972   2635 0.5300517
## 11                  Tepezalá   9114   4590   4524 0.5036208

Bosques Harvard Y formato de horas

Se tiene la información sobre variables como temperatura, humedad, precipitación, entre otras, por intervalos de tiempo para unz aonza boscosa

bosque<-read.csv("Datos bosque Harvard.csv")
dim(bosque)
## [1] 584352     30

Si observamos la variable de interes, la fecha y la hora, se encuentran concatenadas en una sola columna y entre ellas existe la letra T lo que impide el reconocimiento de la información como tal

bosque$datetime[1]
## [1] "2005-01-01T00:15"

Se puede crear una función para corregir este error

trans_fecha<-function(x){
  hora_fechx<-paste0(substr(x,1,10)," ",substr(x,12,16)) #subtr() es una función para extraer texto, us entradas son el texto, donde empieza la extracción y donde termina
  hora_fechaxx<-strptime(hora_fechx, format="%Y-%m-%d %H:%M")
  return(hora_fechaxx)
}
datetime2<-trans_fecha(bosque$datetime)
bosque$datetime22<-datetime2 #generar nueva columna con los datos calculados
dim(bosque)
## [1] 584352     31
bosque$mes_registro<-month(bosque$datetime22)
bosque$year_registro<-year(bosque$datetime22)

Habiendo resuelto esto podemos responder la pregunta ¿Cuándo es menor la temperatura promedio, entre las 3am y 6 am o 10pm y las 11:59p?

grupo11<-c(which(hour(bosque$datetime22)==3),
           which(hour(bosque$datetime22)==4),
           which(hour(bosque$datetime22)==5) )

grupo22<-c(which(hour(bosque$datetime22)==22),
           which(hour(bosque$datetime22)==23) )

prom11<-mean(bosque[grupo11,3],na.rm=TRUE)
prom22<-mean(bosque[grupo22,3],na.rm=TRUE)

prom11
## [1] 5.402454
prom22
## [1] 6.824291
prom11>prom22
## [1] FALSE
prom11<prom22
## [1] TRUE

Funciones Personalizadas

por medio de function() se pueden crear nuevas funciones.
function(argumentos) {instrucciones}
Esto es especialmente util cuando tenemos una serie de instrucciones que se quieren usar en reptidas ocasiones o que al ser tantas operaciones resulta más entendible almacenarlas en una función. Por ejemplo

RANGO

rango<-function(x){max(x)-min(x)}
aggregate(cbind(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)~Species,
          data=iris,rango)
##      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     setosa          1.5         2.1          0.9         0.5
## 2 versicolor          2.1         1.4          2.1         0.8
## 3  virginica          3.0         1.6          2.4         1.1

COEFICIENTE DE VARIABILIDAD

coef_var<-function(x){sd(x)/abs(mean(x))}
apply(iris3[,,1],2,mean)
## Sepal L. Sepal W. Petal L. Petal W. 
##    5.006    3.428    1.462    0.246
apply(iris3[,,1],2,coef_var)
##   Sepal L.   Sepal W.   Petal L.   Petal W. 
## 0.07041344 0.11057887 0.11878522 0.42839670

MEDIA CORTADA

desc_media<-function(x){
  descarte<-c(which(x==max(x)),
              which(x==min(x)))
  
  mean(x[-descarte]) }
mean(iris3[,3,1])
## [1] 1.462
desc_media(iris3[,3,1])
## [1] 1.453191

AREA DE UN CUADRADO

area_cuad<-function(lado)
{
  area<-lado**2
  print(paste("el area es", area ,sep=" ")) #print(paste("texto",resultado,sep=" ")) o cat("texto",resultado,sep=" ") sirven para que la función regrese un texto predeterminado y el resultado
}

area_cuad(5)
## [1] "el area es 25"