Actividad 2
Existen varias maneras de trabajar con R, entre ellas se encuentran:
2+2 #Esto es un comentario
## [1] 4
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)
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
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()
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
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
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
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...
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
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
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
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"