Esta compuesto por una interfase que sirve para tener una interacción más fluida con el programa.
Ventana 1: Es el editor de sintaxis: se trata del lugar donde editamos la sintaxis para posteriormente ejecutarla. Al escribir allí no sucederá nada, a no ser que se apriete algún botón para ejecutar los comandos o la tecla ctrl+enter.
Ventana 2: Entorno de trabajo:en este lugar se muestra el conjunto de datos y los “objetos” (resultados, variables, gráficos, etc.) que se almacenan al ejecutar diferentes análisis.
Ventana 3: Esta compuesta por varias pestañas:
Ventana 4: Es la consola. Corresponde a lo que sería el software R en su versión básica. Allí el software ejecuta las operaciones realizadas desde el editor de sintaxis.
Interactuará con el programa mediante códigos. La sintaxis es un conjunto de códigos. Su uso en R es bastante intuitivo y sigue un patrón lógico. De modo general el lenguaje de programación de R (o sintaxis) sigue la siguiente estructura básica:
2+2 #suma
## [1] 4
8-4 #resta
## [1] 4
9*7 #multiplicación
## [1] 63
a<-52 #asignación de variables
b<-93 #asignación de variables
sin(a) #seno
## [1] 0.9866276
cos(b) #coseno
## [1] 0.3174287
exp(b-a) #exponencial
## [1] 6.398435e+17
log(a+b) #logaritmo
## [1] 4.976734
log(a*b) #logaritmo
## [1] 8.483843
# Este es un comentario
#Ejemplo de ayuda para la función"mean".
# help(mean)
# ?mean
#install.packages("ggplot2")
Para «activar» o utilizar nuestros paquetes podemos ejecutar el comando
#library(ggplot2)
Un vector es la estructura de datos más sencilla en R. Un vector es una colección de uno o más datos del mismo tipo.
Tipo. Un vector tiene el mismo tipo que los datos que contiene. Si tenemos un vector que contiene datos de tipo numérico, el vector será también de tipo numérico.
Largo. Es el número de elementos que contiene un vector. El largo es la única dimensión que tiene esta estructura de datos.
Atributos. Los vectores pueden tener metadatos de muchos tipos, los cuales describen características de los datos que contienen.
Los vectores en R son objetos de una única dimensión que puede contener datos numéricos, cadena de caracteres o datos lógicos, entre otros. Esencialmente son uno de los elementos básicos en la estructura de los datos en R. Pueden contener solo elementos de un solo tipo, aunque su tamaño podría ser ilimitado.
#vector de un solo elemento
vec0<-1:8 #otra forma de crear un vector
vec9<-seq(3,27, length.out = 8)
vec1<-c(1,2,3,4,5) # vector númerico de 6 elementos
vec2<-c("arbol", "casa", "persona") #vector de cadena de texto
vec3<-c(TRUE, TRUE, FALSE, FALSE, TRUE) #vector logico
Realizar operaciones aritméticas (suma, resta, multiplicación y división) con vectores es muy sencillo.Ahora vamos a realizar operaciones aritméticas entre estos dos vectores, incluyendo la suma, la resta, la multiplicación y la división. Es muy importante destacar que estas operaciones aritméticas se producen entre los valores situados en una misma posición dentro de los vectores respectivos. Es devir, el primer elemento del Vector_1 (1) se relaciona con el primer elemento del Vector_2 (4). Si fuese una suma, el resultado de esta primer elemento sería 5. Este proceso se repite sucesivamente con el resto de los elementos de los vectores.
vec1*3 #operación punto vector
## [1] 3 6 9 12 15
vec1/2
## [1] 0.5 1.0 1.5 2.0 2.5
v<-vec0+vec9 #suma de vectores
v
## [1] 4.000000 8.428571 12.857143 17.285714 21.714286 26.142857 30.571429
## [8] 35.000000
k<-vec9-vec0 #sustracción de vectores
k
## [1] 2.000000 4.428571 6.857143 9.285714 11.714286 14.142857 16.571429
## [8] 19.000000
Creacion matrices en R. Con la función matrix(). La función matrix() acepta dos argumentos, nrow y ncol. Con ellos especificamos el número de renglones y columnas que tendrá nuestra matriz. La función matrix permite una matriz en RStudio o R base, pasando como input un vector numérico, de caracteres o lógico Es posible establecer el número de columnas o el número de filas con los argumentos ncol y nrow,
matrix(1:12) #matriz 12*1
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
## [4,] 4
## [5,] 5
## [6,] 6
## [7,] 7
## [8,] 8
## [9,] 9
## [10,] 10
## [11,] 11
## [12,] 12
matrix(1:12, nrow = 3, ncol = 4) #matriz 3*4
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
Otro procedimiento para crear matrices es la unión vectores con las siguientes funciones:
vector_1 <- 1:4
vector_2 <- 5:8
vector_3 <- 9:12
vector_4 <- 13:16
matriz <- rbind(vector_1, vector_2, vector_3, vector_4) #ejemplo de unión por renglon
matriz
## [,1] [,2] [,3] [,4]
## vector_1 1 2 3 4
## vector_2 5 6 7 8
## vector_3 9 10 11 12
## vector_4 13 14 15 16
Ten en cuenta que puedes usar cualquier tipo de datos dentro de una matriz, siempre que sean homogéneos.
M1<-matrix(c(1,2,3,4,5,6,7,8,9),nrow = 3)
M2<-matrix(c(9,8,7,6,5,4,3,2,1),nrow = 3)
M2%*%M1 #Multplicación de matrices. Para multiplicar matrices, utilizar %*%
## [,1] [,2] [,3]
## [1,] 30 84 138
## [2,] 24 69 114
## [3,] 18 54 90
t(M2) #Transpuesta de una matriz
## [,1] [,2] [,3]
## [1,] 9 8 7
## [2,] 6 5 4
## [3,] 3 2 1
diag(M1) #se crea una matriz diagonal con elementos de ka matriz en la diagonal principal.
## [1] 1 5 9
matriz[3,2] #Seleccionar un elemento en una fila y columna en especifico.
## vector_3
## 10
matriz[1:2,2:3] #Selecciona ciertao rango de columnas y filas de una matriz.
## [,1] [,2]
## vector_1 2 3
## vector_2 6 7
La función solve permite obtener la inversa de una matriz cuando sólo se la da un argumento, y permite resolver sistemas de ecuaciones lineales cuando se le dan dos argumentos.
coeficiente<-matrix(c(3,2,1,5,3,4,1,1,-1),ncol=3,byrow=T)
respuesta<-c(1,2,1)
solve(coeficiente,respuesta)
## [1] -4 6 1
También podemos crear una función más compleja para resolver un sistema de ecuaciónes y una respuesta más personalizada.
res_ecua<-function(matriz,respu){
solve(matriz,respu)}
res_ecua(coeficiente,respuesta)
## [1] -4 6 1
res_ecua2<-function(x,y){
solucion<-solve(x,y)
return(paste0("La solución del sistema es: x=",solucion[1]))
}
res_ecua2(y=respuesta,x=coeficiente)
## [1] "La solución del sistema es: x=-3.99999999999999"
coef2<-matrix(c(5,-3,-1,1,4,-6,2,3,4),ncol=3,byrow=TRUE)
resp2<-c(1,-1,9)
res_ecua2(y=resp2,x=coef2)
## [1] "La solución del sistema es: x=1"
res_ecua3<-function(x,y){
solucion<-solve(x,y)
return(paste0("La solución del sistema es: x=",solucion[1],",",
"La solución del sistema es: y=",solucion[2],",",
"La solución del sistema es: z=",solucion[3]) )
}
res_ecua3(y=resp2,x=coef2)
## [1] "La solución del sistema es: x=1,La solución del sistema es: y=1,La solución del sistema es: z=1"
res_ecua3(y=respuesta,x=coeficiente)
## [1] "La solución del sistema es: x=-3.99999999999999,La solución del sistema es: y=5.99999999999999,La solución del sistema es: z=0.999999999999997"
res_ecua4<-function(x,y){
solucion<-solve(x,y)
return(cat("La solución del sistema es:","\n",
"x=", solucion[1],"\n",
"y=",solucion[2],"\n",
"z=",solucion[3]) )
}
res_ecua4(y=respuesta,x=coeficiente)
## La solución del sistema es:
## x= -4
## y= 6
## z= 1
solve(coef2,resp2)
## [1] 1 1 1
Los data frames son estructuras de datos de dos dimensiones (rectangulares) que pueden contener datos de diferentes tipos, por lo tanto, son heterogéneas. Esta estructura de datos es la más usada para realizar análisis de datos. Podemos entender a los data frames como una versión más flexible de una matriz. Mientras que en una matriz todas las celdas deben contener datos del mismo tipo, los renglones de un data frame admiten datos de distintos tipos, pero sus columnas conservan la restricción de contener datos de un sólo tipo.
Para crear un data frame usamos la función data.frame(). Esta función nos pedirá un número de vectores igual al número de columnas que deseemos. Todos los vectores que proporcionemos deben tener el mismo largo.
mi_df <- data.frame(
"entero" = 1:4,
"factor" = c("a", "b", "c", "d"),
"numero" = c(1.2, 3.4, 4.5, 5.6),
"cadena" = as.character(c("a", "b", "c", "d"))
)
mi_df
## entero factor numero cadena
## 1 1 a 1.2 a
## 2 2 b 3.4 b
## 3 3 c 4.5 c
## 4 4 d 5.6 d
dim(mi_df) #dimensión de filas y columnas
## [1] 4 4
length(mi_df) #El largo de un data frame por columnas
## [1] 4
names(mi_df) #Nos permite ver los nombres de las columnas
## [1] "entero" "factor" "numero" "cadena"
Al igual que con una matriz, si aplicamos una operación aritmética a un data frame, esta se vectorizará.
Los resultados que obtendremos dependerán del tipo de datos de cada columna. R nos devolverá todas las advertencias que ocurran como resultado de las operaciones realizadas, por ejemplo, aquellas que hayan requerido una coerción.
Trabajaremos con un dataset muy conocido en analisis de datos llamado ´ Iris. El dataset se compone de 150 observaciones de flores de la planta iris. Existen tres tipos de clases de flores iris: virginica, setosa y versicolor. Hay 50 observaciones de cada una. Las variables o atributos que se miden de cada flor son: - El tipo de flor como variable categorica. ´ - El largo y el ancho del petalo en cm como variables numericas. ´ - El largo y el ancho del sepalo en cm como variables numericas.
data(iris)#cargar el dataset al workspace
data(iris3)
Por medio de de preguntas informativas podemos darnos cuenta de que tipos de datos se tratan estas dos bases de datos
data(iris)
is.matrix(iris)
## [1] FALSE
is.data.frame(iris) #Es un data.frame
## [1] TRUE
is.list(iris)
## [1] TRUE
is.factor(iris[,5])
## [1] TRUE
is.numeric(iris[,1])
## [1] TRUE
data(iris3)
is.data.frame(iris3)
## [1] FALSE
is.matrix(iris3)
## [1] FALSE
is.list(iris3)
## [1] FALSE
dim(iris3)
## [1] 50 4 3
head(iris3)
## , , Setosa
##
## Sepal L. Sepal W. Petal L. Petal W.
## [1,] 5.1 3.5 1.4 0.2
## [2,] 4.9 3.0 1.4 0.2
## [3,] 4.7 3.2 1.3 0.2
## [4,] 4.6 3.1 1.5 0.2
## [5,] 5.0 3.6 1.4 0.2
## [6,] 5.4 3.9 1.7 0.4
##
## , , Versicolor
##
## Sepal L. Sepal W. Petal L. Petal W.
## [1,] 7.0 3.2 4.7 1.4
## [2,] 6.4 3.2 4.5 1.5
## [3,] 6.9 3.1 4.9 1.5
## [4,] 5.5 2.3 4.0 1.3
## [5,] 6.5 2.8 4.6 1.5
## [6,] 5.7 2.8 4.5 1.3
##
## , , Virginica
##
## Sepal L. Sepal W. Petal L. Petal W.
## [1,] 6.3 3.3 6.0 2.5
## [2,] 5.8 2.7 5.1 1.9
## [3,] 7.1 3.0 5.9 2.1
## [4,] 6.3 2.9 5.6 1.8
## [5,] 6.5 3.0 5.8 2.2
## [6,] 7.6 3.0 6.6 2.1
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
Por medio de la función mean podemos obtener promedio de cada flor
#Promedio de Sepal. L de cada flor
mean(iris3[,1,1]) #Sepal. L de Setosa
## [1] 5.006
mean(iris3[,1,2]) #Sepal L de versicolor
## [1] 5.936
mean(iris3[,1,3])#Sepal L de Virginica
## [1] 6.588
mean(iris3[,2,1]) #Sepal. w de Setosa
## [1] 3.428
mean(iris3[,2,2]) #Sepal w de versicolor
## [1] 2.77
mean(iris3[,2,3])#Sepal w de Virginica
## [1] 2.974
De igual forma se puede obtener el promedio pero por columna.
#Promedios por columna
prom_setosa<-apply(iris[1:50,-5],2,mean) #Promedios de Setosa
prom_setosa
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 5.006 3.428 1.462 0.246
prom_versi<-apply(iris[51:100,-5],2,mean) #Promedios de Versicolor
prom_versi
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 5.936 2.770 4.260 1.326
prom_virgi<-apply(iris[101:150,-5],2,mean) #Promedios de Virginica
prom_virgi
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 6.588 2.974 5.552 2.026
Podemos crear un data frame que contenga los promedios de cada columna.
promedio_flores<-data.frame(Setosa=prom_setosa,
Versicolor=prom_versi,
Virginical=prom_virgi)
promedio_flores
## Setosa Versicolor Virginical
## Sepal.Length 5.006 5.936 6.588
## Sepal.Width 3.428 2.770 2.974
## Petal.Length 1.462 4.260 5.552
## Petal.Width 0.246 1.326 2.026
En el siguiente data frame estamos usando una función muy util para análisis de datos, apply:
apply aplica una función a todos los elementos de una matriz. El comando apply en R permite aplicar una función a través de una matriz, array o data frame. Puedes hacer esto de varias maneras, dependiendo de cómo configures el argumento MARGIN, que habitualmente puede tomar los valores 1, 2 o c(1, 2).
#Obtener la desviación estandar de cada flor de sus 4 variables
sd_setosa<-apply(iris3[,,1],2,sd)
sd_versi<-apply(iris3[,,2],2,sd)
sd_virgi<-apply(iris3[,,3],2,sd)
#Conjuntar la información
sd_flores<-data.frame(Setosa=sd_setosa,
Versicolor=sd_versi,
Virginical=sd_virgi)
sd_flores
## Setosa Versicolor Virginical
## Sepal L. 0.3524897 0.5161711 0.6358796
## Sepal W. 0.3790644 0.3137983 0.3224966
## Petal L. 0.1736640 0.4699110 0.5518947
## Petal W. 0.1053856 0.1977527 0.2746501
Podemos modificar el nombre de las columnas y filas de la siguiente forma.
rownames(sd_flores)<-c("Largo sépalo","Ancho sépalo","Largo pétalo",
"Ancho pétalo")
colnames(sd_flores)<-c("Set","Versi","Virgi")
sd_flores
## Set Versi Virgi
## Largo sépalo 0.3524897 0.5161711 0.6358796
## Ancho sépalo 0.3790644 0.3137983 0.3224966
## Largo pétalo 0.1736640 0.4699110 0.5518947
## Ancho pétalo 0.1053856 0.1977527 0.2746501
En R, puedes usar la función aggregate para calcular resúmenes estadísticos para subconjuntos de datos. Esta función es muy similar a la función tapply pero en este caso también puedes pasar una fórmula o un objeto de serie temporal como entrada y además la salida es un data frame. En este tutorial aprenderás cómo usar la función aggregate en R con varios ejemplos, para agregar filas en base a un factor. La sintaxis de la función aggregate dependerá de los datos de entrada. Hay tres tipos de entrada posibles: un data frame, una fórmula y un objeto de clase serie temporal.
aggregate(Sepal.Length~Species,data=iris,mean)
## Species Sepal.Length
## 1 setosa 5.006
## 2 versicolor 5.936
## 3 virginica 6.588
aggregate(Sepal.Width~Species,data=iris,mean)
## Species Sepal.Width
## 1 setosa 3.428
## 2 versicolor 2.770
## 3 virginica 2.974
aggregate(cbind(Sepal.Length,Sepal.Width,Petal.Length,
Petal.Width)~Species,data=iris,mean)
## Species 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.026
aggregate(cbind(Sepal.Length,Sepal.Width,Petal.Length,
Petal.Width)~Species,data=iris,summary)
## Species Sepal.Length.Min. Sepal.Length.1st Qu. Sepal.Length.Median
## 1 setosa 4.300 4.800 5.000
## 2 versicolor 4.900 5.600 5.900
## 3 virginica 4.900 6.225 6.500
## Sepal.Length.Mean Sepal.Length.3rd Qu. Sepal.Length.Max. Sepal.Width.Min.
## 1 5.006 5.200 5.800 2.300
## 2 5.936 6.300 7.000 2.000
## 3 6.588 6.900 7.900 2.200
## Sepal.Width.1st Qu. Sepal.Width.Median Sepal.Width.Mean Sepal.Width.3rd Qu.
## 1 3.200 3.400 3.428 3.675
## 2 2.525 2.800 2.770 3.000
## 3 2.800 3.000 2.974 3.175
## Sepal.Width.Max. Petal.Length.Min. Petal.Length.1st Qu. Petal.Length.Median
## 1 4.400 1.000 1.400 1.500
## 2 3.400 3.000 4.000 4.350
## 3 3.800 4.500 5.100 5.550
## Petal.Length.Mean Petal.Length.3rd Qu. Petal.Length.Max. Petal.Width.Min.
## 1 1.462 1.575 1.900 0.100
## 2 4.260 4.600 5.100 1.000
## 3 5.552 5.875 6.900 1.400
## Petal.Width.1st Qu. Petal.Width.Median Petal.Width.Mean Petal.Width.3rd Qu.
## 1 0.200 0.200 0.246 0.300
## 2 1.200 1.300 1.326 1.500
## 3 1.800 2.000 2.026 2.300
## Petal.Width.Max.
## 1 0.600
## 2 1.800
## 3 2.500
Este comando nos permite encontrar índices (entiéndase números de orden) que cumplen cierta característica.
x <- c(1,5,8,4,6)
x
## [1] 1 5 8 4 6
which(x == 5)
## [1] 2
which(x != 5)
## [1] 1 3 4 5
rango<-function(x){max(x)-min(x)}
rango(iris3[,1,1]) #Setosa
## [1] 1.5
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,rango) #Columna
## Sepal L. Sepal W. Petal L. Petal W.
## 1.5 2.1 0.9 0.5
apply(iris3[,,1],1,rango) #fila
## [1] 4.9 4.7 4.5 4.4 4.8 5.0 4.3 4.8 4.2 4.8 5.2 4.6 4.7 4.2 5.6 5.3 5.0 4.8 5.4
## [20] 4.8 5.2 4.7 4.4 4.6 4.6 4.8 4.6 5.0 5.0 4.5 4.6 5.0 5.1 5.3 4.7 4.8 5.3 4.8
## [39] 4.2 4.9 4.7 4.2 4.2 4.4 4.7 4.5 4.9 4.4 5.1 4.8
aggregate(cbind(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)~Species,
data=iris,mean)
## Species 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.026
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
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
aggregate(cbind(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)~Species,
data=iris,coef_var)
## Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 setosa 0.07041344 0.1105789 0.11878522 0.4283967
## 2 versicolor 0.08695606 0.1132846 0.11030774 0.1491348
## 3 virginica 0.09652089 0.1084387 0.09940466 0.1355627
iris3[,1,1]
## [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7
## [20] 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9
## [39] 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0
max(iris3[,1,1])
## [1] 5.8
min(iris3[,1,1])
## [1] 4.3
descarte<-c(which(iris3[,3,1]==max(iris3[,3,1])),
which(iris3[,3,1]==min(iris3[,3,1])))
mean(iris3[-descarte,1,1])
## [1] 5.017021
desc_media<-function(x){
descarte<-c(which(x==max(x)),
which(x==min(x)))
mean(x[-descarte]) }
desc_media(iris3[,3,1])
## [1] 1.453191
desc_media(iris3[,4,1])
## [1] 0.2545455
mean(iris3[,3,1])
## [1] 1.462
apply(iris3[,,1],2,desc_media)
## Sepal L. Sepal W. Petal L. Petal W.
## 5.0041667 3.4312500 1.4531915 0.2545455
aggregate(cbind(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)~Species,
data=iris,desc_media)
## Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 setosa 5.004167 3.431250 1.453191 0.2545455
## 2 versicolor 5.935417 2.772917 4.268750 1.3690476
## 3 virginica 6.595833 2.955319 5.545833 2.0086957
Quitarle los dos últimos y los dos primeros
longi<-length(iris3[,3,1])
posis_quit<-c(1,2,longi-1,longi)
ordenado<-sort(iris3[,3,1],decreasing=TRUE)
mean(ordenado[-posis_quit])
## [1] 1.46087
corte_dos<-function(w){
longi<-length(w)
posis_quit<-c(1,2,longi-1,longi)
ordenado<-sort(w,decreasing=TRUE)
mean(w[-posis_quit]) }
corte_dos(iris[,2])
## [1] 3.05274
apply(iris3[,,1],2,corte_dos)
## Sepal L. Sepal W. Petal L. Petal W.
## 5.000000 3.432609 1.465217 0.250000
aggregate(cbind(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)~Species,
data=iris,corte_dos)
## Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 setosa 5.000000 3.432609 1.465217 0.250000
## 2 versicolor 5.926087 2.756522 4.276087 1.326087
## 3 virginica 6.634783 2.963043 5.565217 2.017391
Esta base de datos corresponde a la longitud de odontoblastos (Celulas responsables del crecimiento de los dientes) de 60 conejillos de indias. Cada animal recibió uno de los tres niveles de dosis de vitamina C (0.5, 1 y 2 mg / día) por uno de dos métodos de administración: jugo de naranja (OJ) y el otro es ácido ascórbico (una forma de vitamina C) codificada como (VC).
Variables: Este es un dataframe de 60 observaciones con tres variables len: Longitud del diente. Esta es una variable cuantitativa continua y está expresada en milimetros.
supp: Tipo de suplemento: Jugo de Naranja (OJ)- Ácido ascorbico (VC).Esta es una variable categórica
Dose: Dosis numérica en miligramos/día de vitamina C. Esta es una variable cuantitativa continua
data("ToothGrowth")
head(ToothGrowth)
## len supp dose
## 1 4.2 VC 0.5
## 2 11.5 VC 0.5
## 3 7.3 VC 0.5
## 4 5.8 VC 0.5
## 5 6.4 VC 0.5
## 6 10.0 VC 0.5
dim(ToothGrowth)
## [1] 60 3
?ToothGrowth
## starting httpd help server ... done
mean(ToothGrowth$len)
## [1] 18.81333
mean(ToothGrowth$dose)
## [1] 1.166667
sd(ToothGrowth$dose)
## [1] 0.6288722
max(ToothGrowth$len)
## [1] 33.9
min(ToothGrowth$len)
## [1] 4.2
¿Cuál es el promedio de crecimiento por método de aplicación? Para este caso hacemos uso de la función aggregate.
aggregate(len~supp,data=ToothGrowth,mean)
## supp len
## 1 OJ 20.66333
## 2 VC 16.96333
aggregate(len~dose,data=ToothGrowth, mean)
## dose len
## 1 0.5 10.605
## 2 1.0 19.735
## 3 2.0 26.100
aggregate(len~supp+dose,data=ToothGrowth, mean)
## supp dose len
## 1 OJ 0.5 13.23
## 2 VC 0.5 7.98
## 3 OJ 1.0 22.70
## 4 VC 1.0 16.77
## 5 OJ 2.0 26.06
## 6 VC 2.0 26.14
aggregate(len~dose+supp,data=ToothGrowth,mean)
## dose supp len
## 1 0.5 OJ 13.23
## 2 1.0 OJ 22.70
## 3 2.0 OJ 26.06
## 4 0.5 VC 7.98
## 5 1.0 VC 16.77
## 6 2.0 VC 26.14
Cargamos la base de datos de Excel
library("readxl")
datos10 <- read_excel("C:/Users/permi/Desktop/CIDE/Primer semestre/ESTADISTICA/datos_ags_estado_2020.xlsx",sheet="Hoja1",range="A1:HV481",na =c("*","N/D"))
Con el propósito de hacer EDA(Análsis de Datos Exploratorio) nos hacemos las siguientes preguntas:
aggregate(as.numeric(POBTOT)~NOM_MUN,data=datos10,mean)
## NOM_MUN as.numeric(POBTOT)
## 1 Aguascalientes 2707.045
## 2 Asientos 1110.000
## 3 Calvillo 1668.647
## 4 Cosío 1211.000
## 5 El Llano 2102.333
## 6 Jesús María 2378.634
## 7 Pabellón de Arteaga 2356.733
## 8 Rincón de Romos 2660.125
## 9 San Francisco de los Romo 2431.368
## 10 San José de Gracia 934.500
## 11 Tepezalá 1302.000
aggregate(as.numeric(POBTOT)~NOM_MUN, data=datos10,sum)
## NOM_MUN as.numeric(POBTOT)
## 1 Aguascalientes 901446
## 2 Asientos 17760
## 3 Calvillo 28367
## 4 Cosío 8477
## 5 El Llano 6307
## 6 Jesús María 97524
## 7 Pabellón de Arteaga 35351
## 8 Rincón de Romos 42562
## 9 San Francisco de los Romo 46196
## 10 San José de Gracia 5607
## 11 Tepezalá 9114
aggregate(as.numeric(POBFEM)~NOM_MUN, data=datos10,sum)
## NOM_MUN as.numeric(POBFEM)
## 1 Aguascalientes 463697
## 2 Asientos 9087
## 3 Calvillo 14561
## 4 Cosío 4410
## 5 El Llano 3219
## 6 Jesús María 49513
## 7 Pabellón de Arteaga 18046
## 8 Rincón de Romos 21748
## 9 San Francisco de los Romo 23331
## 10 San José de Gracia 2972
## 11 Tepezalá 4590
aggregate(as.numeric(POBMAS)~NOM_MUN, data=datos10,sum)
## NOM_MUN as.numeric(POBMAS)
## 1 Aguascalientes 437749
## 2 Asientos 8673
## 3 Calvillo 13806
## 4 Cosío 4067
## 5 El Llano 3088
## 6 Jesús María 48011
## 7 Pabellón de Arteaga 17305
## 8 Rincón de Romos 20808
## 9 San Francisco de los Romo 22865
## 10 San José de Gracia 2635
## 11 Tepezalá 4524
tabla15<-aggregate(cbind(as.numeric(VIVTOT),as.numeric(POBTOT))~NOM_MUN,data=datos10,sum)
tabla15$Pro_viv<-tabla15$V2/tabla15$V1
tabla15$Pro_viv
## [1] 3.027008 3.462663 3.002117 3.460000 3.326477 3.166981 3.719200 3.544175
## [9] 2.872171 2.946400 3.430184
san_jose<-which(datos10$NOM_MUN=="San José de Gracia")
datos_san_jose<-datos10[san_jose,]
sum(as.numeric(datos_san_jose$POBTOT))
## [1] 5607
tabla18<-aggregate(cbind(as.numeric(POBTOT),as.numeric(POBFEM))~NOM_MUN+AGEB,
data=datos10,sum)
tabla18$Prop_muj<-tabla18$V2/tabla18$V1
head(tabla18$Prop_muj)
## [1] 0.5129280 0.5082700 0.5115773 0.5137969 0.5249846 0.4960110
Procedemos a descargar las bases de datos con las que trabajaremos. En este caso son archivos csv:
covid_oaxaca<-read.csv("C:\\Users\\permi\\Desktop\\CIDE\\Primer semestre\\R\\covid_oaxaca.csv")
fallecidos_oaxaca<-read.csv("C:\\Users\\permi\\Desktop\\CIDE\\Primer semestre\\R\\fallecidos.csv")
Para este caso, la base de datos contiene una columna de fechas y es la que procedemos a manipular. Cuando vamos a realizar algún tipo de código en R para el que necesitemos utilizar fechas, debemos tener presente el formato en el que R almacena las fechas, ya que nos será de utilidad a la hora de trabajar con ellas.
El estándar utilizado por R para las fechas es yyyy-mm-dd, es decir, año-mes-día. Para introducir una fecha en R, debemos utilizar siempre el comando ‘as.Date‘. Si no lo utilizamos, el programa leerá nuestra fecha como una variable ‘character‘, y lógicamente no podremos utilizarla como fecha. * %d día (numérico, de 0 a 31) * %a día de la semana abreviado a tres letras * %A día de la semana (nombre completo) * %m mes (numérico de 0 a 12) * %b mes (nombre abreviado a tres letras) * %B mes (nombre completo) * %y año (con dos dígitos) * %Y año (con cuatro dígitos)
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
FechasIngreso<- as.Date(covid_oaxaca$FECHA_INGRESO,format="%Y-%m-%d")
mes<- month(FechasIngreso)
hist(mes, main="Mes", xlab = "meses", ylab="ingreso")
DiasIngreso<- day(FechasIngreso)
boxplot(DiasIngreso)
bosque<-read.csv("C:\\Users\\permi\\Desktop\\CIDE\\Primer semestre\\R\\Datos bosque Harvard.csv")
bosque$datetime[1]
## [1] "2005-01-01T00:15"
fechax<-substr(bosque$datetime[1],1,10)
horax<-substr(bosque$datetime[1],12,16)
hora_fechx<-paste0(fechax," ",horax)
hora_fechaxx<-strptime(hora_fechx,format = "%Y-%m-%d %H:%M")
hour(hora_fechaxx)
## [1] 0
minute(hora_fechaxx)
## [1] 15
year(hora_fechaxx)
## [1] 2005
month(hora_fechaxx)
## [1] 1
day(hora_fechaxx)
## [1] 1
Funcion que transforme el formato 2005-01-01T00:15 a uno de tipo strptime
transformadora <-function(x){
f_bosque <-substr(x,1,10)
t_bosque <-substr(x,12,16)
f_t_bosque <-paste0(f_bosque," ",t_bosque)
f_t_bosque_strptime <-strptime(f_t_bosque,
format="%Y-%m-%d %H:%M")
return(f_t_bosque_strptime)
}
bosque$datetime[1]
## [1] "2005-01-01T00:15"
transformadora(bosque$datetime[1])
## [1] "2005-01-01 00:15:00 CST"
Devolviendo lista
head(lapply(bosque$datetime,FUN = transformadora))
## [[1]]
## [1] "2005-01-01 00:15:00 CST"
##
## [[2]]
## [1] "2005-01-01 00:30:00 CST"
##
## [[3]]
## [1] "2005-01-01 00:45:00 CST"
##
## [[4]]
## [1] "2005-01-01 01:00:00 CST"
##
## [[5]]
## [1] "2005-01-01 01:15:00 CST"
##
## [[6]]
## [1] "2005-01-01 01:30:00 CST"
Devolviendo vector o matriz
head(sapply(bosque$datetime,FUN = transformadora))
## $`2005-01-01T00:15`
## [1] "2005-01-01 00:15:00 CST"
##
## $`2005-01-01T00:30`
## [1] "2005-01-01 00:30:00 CST"
##
## $`2005-01-01T00:45`
## [1] "2005-01-01 00:45:00 CST"
##
## $`2005-01-01T01:00`
## [1] "2005-01-01 01:00:00 CST"
##
## $`2005-01-01T01:15`
## [1] "2005-01-01 01:15:00 CST"
##
## $`2005-01-01T01:30`
## [1] "2005-01-01 01:30:00 CST"