R es un entorno y lenguaje de programación empleado para acceder a una amplia gama de técnicas y métodos estadísticos y la visualización de datos.
Entre los atractivos para utilizar R, se encuentran (Carmona, 2007):
-Flexibilidad. Ofrece el acceso a análisis preempaquetados (como la regresión, por ejemplo), al tiempo que, permite diseñar análisis en función de las problemáticas que se presentan: manipular datos y funciones.
-Variedad de gráficos de alta calidad. Técnica útiles en la visualización de datos y producción de gráficos para los papers.
-R cuenta con una comunidad bastante dinámica. Entre ellos estadísticos de renombre.
-Aplicaciones particulares a distintas áreas de conocimiento.
Entre las múltiples funcionalidades de R, este se puede utilizar para realizar operaciones aritméticas, tales como:
- Suma y resta
2 + 2
#> [1] 47 - 5
#> [1] 2- Multiplicación
10*3
#> [1] 30- División
45/3
#> [1] 15La asignación de valores a un objeto R se realiza de la manera siguiente:
x <- 5
y <- 3
assign("y",3)Se pude verificar el valor de x tecleando su nombre en la consola de R
x
#> [1] 5En adición, se puede realizar las opereaciones anteriores e, incluso, asignar los resultado a otra variable:
x-y
#> [1] 2
z <- x-y
z
#> [1] 2Para verificar las varaibles (objetos en general), que se hayan definido en el entorno de R y/o removerlas se pueden emplear las funciones ls() y rm():
ls()
#> [1] "x" "y" "z"
rm(x,y,z)
ls()
#> character(0)El lenguaje R dispone de diversos tipos de datos,por lo general, los tipos más comunes son:
- Numérico
var_numero <- 42- caracteres
var_caracter <- "universe"- lógico
var_logico <- FALSEPara acceder al tipo de dato de una variable, u otro objeto R, se utiliza la función class(), de la manera siguiente:
class(var_numero)
#> [1] "numeric"
class(var_caracter)
#> [1] "character"
class(var_logico)
#> [1] "logical"Un vector se puede entender como una colección ordenada de elementos del mismo tipo. Para definir un vector se emplea la función c():
num_vector <- c(1, 10, 49)
car_vector <- c("a", "b", "c")
bol_vector <-c(TRUE, FALSE, TRUE)Otra forma de crear un vector es mediante el empleo de la función assign(), utilizando como primer algumento el nombre que se dará al vector y de segundo la colección de valores.
assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7))Un vector se puede crear, en adición, como una secuencia de números, tal como:
y <- 1:5Una vez creado un vector se pueden realizar operaciones aritmeticas como las vista con anterioridad.
v <- 2*x
v
#> [1] 20.8 11.2 6.2 12.8 43.4Se puede aceder a los elementos de un vector indicando la posición del elemento en entre corchetes “[]”. Así, para aceder los elementos de x, se puede proceder como:
x[1]
#> [1] 10.4
x[3:5]
#> [1] 3.1 6.4 21.7
x[-1]
#> [1] 5.6 3.1 6.4 21.7
x[-1:-3]
#> [1] 6.4 21.7
z <- c(x[1], x[5])
z
#> [1] 10.4 21.7De manera similar, se pueden actualizar los valores de un vector.
x
#> [1] 10.4 5.6 3.1 6.4 21.7
x[1]<-0
x
#> [1] 0.0 5.6 3.1 6.4 21.7
x[4:5]<-c(10,15)
x
#> [1] 0.0 5.6 3.1 10.0 15.0Para verificar la longitud de un vector se puede utilizar la funcion length().
length(x)
#> [1] 5Al igual que en el caso de las variables, se puede verificar la clase de un vector utilizando tanto la función class() como mode().
class(x)
#> [1] "numeric"
mode(x)
#> [1] "numeric"Los factores son una forma fácil y compacta de lidiar con variables categóricas (nominales). Estos tienen etiquetas que indican los posibles valores que pueden tomar. Partiendo de un vector con datos sobre el sexo de un grupo de individuos como:
g <- c("f", "m", "m", "m", "f", "m", "f", "m", "f", "f")
g
#> [1] "f" "m" "m" "m" "f" "m" "f" "m" "f" "f"Se puede crear un vector utilizando la función factor().
g <- factor(g)
g
#> [1] f m m m f m f m f f
#> Levels: f mOtro forma más directa de crear el factor anterior es:
g <- factor(c("f", "m", "m", "m", "f", "m", "f", "m", "f", "f"), levels = c("f","m"))
g
#> [1] f m m m f m f m f f
#> Levels: f mPara ver la distribución de hombres y mujeres en el factor g se puede emplear la función table().
table (g)
#> g
#> f m
#> 5 5En adición, se puede utilizar table() para obtener una fabulación cruzada de varios factores. De esta manera:
a <- factor(c("adulto","adulto","juvenil","juvenil","adulto","adulto","adulto",'juvenile',"adulto","juvenil"))
table(a,g)
#> g
#> a f m
#> adulto 4 2
#> juvenil 1 2
#> juvenile 0 1Supongamos que una persona es propietaria de un negocio con dos establecimientos y reporta las ventas netas de ambos para una semana representativa del negocio.
venta_puesto1 <- c(40000, -17000, 20000, 25000, 240000,
300000, 350000)
venta_puesto2 <- c(-20000, 50000, 60000, 10000, 100000,
125000, 150000)
dias <- c("lunes", "martes", "miercoles", "jueves", "viernes",
"sabado","domingo")Para vincular las ventas en en cada establecimiento a los días de la semana, se puede proceder de la manera siguiente:
names(venta_puesto1) <- dias
names(venta_puesto2) <- diasUna vez definido los vectores con las ventas y asociadas a los días de la semana, se puede responder a preguntas como:
- ¿En cuál establecimiento se vende más?
#ventas totales
sum(venta_puesto1)
#> [1] 958000
sum(venta_puesto2)
#> [1] 475000
#ventas promedio
mean(venta_puesto1)
#> [1] 136857.1
mean(venta_puesto2)
#> [1] 67857.14- ¿Cuáles días se vende más y menos en ambos establecimeintos?
#ventas maxina
max(venta_puesto1)
#> [1] 350000
max(venta_puesto2)
#> [1] 150000
#ventas minina
min(venta_puesto1)
#> [1] -17000
min(venta_puesto2)
#> [1] -20000- ¿Cuáles día se reportan perdida?
#Días malos
venta_puesto1[venta_puesto1<0]
#> martes
#> -17000
venta_puesto2[venta_puesto2<0]
#> lunes
#> -20000- ¿Algun día el puesto 1 tiene ventas menores que el puesto 2?
#Comparando venta día a día
venta_puesto1[venta_puesto1<venta_puesto2]
#> martes miercoles
#> -17000 20000- ¿Qué día el negocio tiene mayores ganancias?
#mejor día de la semana
ganancias <- venta_puesto1+venta_puesto2
ganancias[ganancias==max(ganancias)]
#> domingo
#> 5e+05- ¿En qué local las vengas son más estables?
volatilidad1 <- (sd(venta_puesto1)/mean(venta_puesto1))*100
volatilidad2 <- (sd(venta_puesto2)/mean(venta_puesto2))*100
volatilidad1
#> [1] 112.3713
volatilidad2
#> [1] 90.23003Las matrices son un tipo de vectores más generalizados, caracterizado por tener una dimensión como atributo adicional. Dicho atributo es un vector entero con dos elementos, los cuales denotan el número de fila y columna respectivamente.
Existen múltiples maneras de crear un vector, una de ellas es a partir de un vector, asignando las dimensiones correspondientes.
mat <- 1:20
dim(mat) <-c(4,5)
mat
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] 1 5 9 13 17
#> [2,] 2 6 10 14 18
#> [3,] 3 7 11 15 19
#> [4,] 4 8 12 16 20
class(mat)
#> [1] "matrix" "array"Otra forma de realizar lo anterior, es por medio de la funsion matrix(), como sigue:
mat <- 1:20
mat<-matrix(mat, nrow = 4, ncol = 5, byrow = FALSE)
mat
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] 1 5 9 13 17
#> [2,] 2 6 10 14 18
#> [3,] 3 7 11 15 19
#> [4,] 4 8 12 16 20También se puede crear una matriz a partir de varios vectores:
mat<-matrix(c(venta_puesto1, venta_puesto2), nrow = 2, ncol = 7, byrow = TRUE)Y se puede asignar nombre de filas y columnas:
filas <- c("puesto1","puesto2")
rownames(mat) <- filas
colnames(mat) <- dias
mat
#> lunes martes miercoles jueves viernes sabado domingo
#> puesto1 40000 -17000 20000 25000 240000 300000 350000
#> puesto2 -20000 50000 60000 10000 100000 125000 150000Los nombres de las filas y columnas asignados a la matriz mat se puede utilizar para consultar valores específicos de dicha matriz, en combinación con el operador [].
mat["puesto1",]
#> lunes martes miercoles jueves viernes sabado domingo
#> 40000 -17000 20000 25000 240000 300000 350000
mat[1,]
#> lunes martes miercoles jueves viernes sabado domingo
#> 40000 -17000 20000 25000 240000 300000 350000
mat[,"lunes"]
#> puesto1 puesto2
#> 40000 -20000
mat[,1]
#> puesto1 puesto2
#> 40000 -20000
mat["puesto1","domingo"]
#> [1] 350000
mat[1,7]
#> [1] 350000Las operaciones aritméticas antes realizadas son validas para matrices, siempre que se cumpla que las matrices en cuestión tengan las mismas dimensiones.
Operaciones basica
A <- matrix (c(7, -1, 6, 9), byrow = T, nrow = 2)
B <- matrix (c(0, 4, 3, -2), byrow = T, nrow = 2)
C <- matrix (c(8, 3, 6, 1), byrow = T, nrow = 2)
A
#> [,1] [,2]
#> [1,] 7 -1
#> [2,] 6 9
B
#> [,1] [,2]
#> [1,] 0 4
#> [2,] 3 -2
C
#> [,1] [,2]
#> [1,] 8 3
#> [2,] 6 1
#Suma y resta
A+B
#> [,1] [,2]
#> [1,] 7 3
#> [2,] 9 7
#Multiplicacion
C%*%B
#> [,1] [,2]
#> [1,] 9 26
#> [2,] 3 22Propiedades de las matrices
(A+B)+C
#> [,1] [,2]
#> [1,] 15 6
#> [2,] 15 8
(A+C)+B
#> [,1] [,2]
#> [1,] 15 6
#> [2,] 15 8
A%*%B==B%*%A
#> [,1] [,2]
#> [1,] FALSE FALSE
#> [2,] FALSE FALSE
(A%*%C)%*%B==(A%*%B)+(C%*%B)
#> [,1] [,2]
#> [1,] FALSE FALSE
#> [2,] FALSE FALSESistemas de ecouaciones
Una utilidad de los objetos matrices, es que permiten resolver sistemas de ecuaciones de manera sencilla, como se ilustra en la lineas siguientes.
Asumiendo el sistemas de acusaciones siguiente: 3x 2y 1z = 1 5x 3y 4z = 2 x y -1z = 1
Resolucion por eliminación de la variables
SC <- matrix (c(3, 2, 1, 1,5,3,4,2,1,1,-1,1), byrow = T, nrow = 3)
SC [1,]<-SC [1,]- 3*(SC [3,])
SC
#> [,1] [,2] [,3] [,4]
#> [1,] 0 -1 4 -2
#> [2,] 5 3 4 2
#> [3,] 1 1 -1 1
SC [2,]<-SC [2,]-5*(SC [3,])
SC
#> [,1] [,2] [,3] [,4]
#> [1,] 0 -1 4 -2
#> [2,] 0 -2 9 -3
#> [3,] 1 1 -1 1
SC [2,]<-SC [2,]-2*(SC [1,])
SC
#> [,1] [,2] [,3] [,4]
#> [1,] 0 -1 4 -2
#> [2,] 0 0 1 1
#> [3,] 1 1 -1 1
# 0x -y 4z = -2
# 0x 0y z = 1
# x y -z = 1
y=6
z=1
x=-4
3*x +2*y +z == 1
#> [1] TRUE
5*x +3*y + 4*z == 2
#> [1] TRUE
x + y -z == 1
#> [1] TRUETodos los objetos R antes presentados tienen la particularidad de que almacenan una única clase de datos. Sin embargo, R soporta estructura de datos que pueden contener elementos de distintas clases, como son las listas. Una lista puede ser equivalente a un vector con objetos R como elementos, los cuales pueden ser de tipos totalmente distintos.
En el sentido anterior, en una misma lista se puede alojar los distintos tipo de objetos antes creados:
mi_lista <- list(venta_puesto1, 6, "alma", A, dias, c(1,2,3))
mi_lista
#> [[1]]
#> lunes martes miercoles jueves viernes sabado domingo
#> 40000 -17000 20000 25000 240000 300000 350000
#>
#> [[2]]
#> [1] 6
#>
#> [[3]]
#> [1] "alma"
#>
#> [[4]]
#> [,1] [,2]
#> [1,] 7 -1
#> [2,] 6 9
#>
#> [[5]]
#> [1] "lunes" "martes" "miercoles" "jueves" "viernes" "sabado"
#> [7] "domingo"
#>
#> [[6]]
#> [1] 1 2 3Como un ejemplo más estructurado, se puede tener:
colegio_lista <- list(maestros=c("Antonio", "Maria","Patria", "Anemecio"), estudiantes=c("Juan", "Emeraldo", "Manparo","Manpio"), codigo_dist=798,calificaciones=c(80, 75,90,85))
colegio_lista
#> $maestros
#> [1] "Antonio" "Maria" "Patria" "Anemecio"
#>
#> $estudiantes
#> [1] "Juan" "Emeraldo" "Manparo" "Manpio"
#>
#> $codigo_dist
#> [1] 798
#>
#> $calificaciones
#> [1] 80 75 90 85Acceder a los elementos de una lista
Para acceder a los elementos de una lista se pueden utilizar tres operadores, [], [[]] y $.
colegio_lista$maestros
#> [1] "Antonio" "Maria" "Patria" "Anemecio"
colegio_lista[["calificaciones"]]
#> [1] 80 75 90 85
colegio_lista[[1]]
#> [1] "Antonio" "Maria" "Patria" "Anemecio"
colegio_lista[["estudiantes"]][1]
#> [1] "Juan"Un tipo de lista que puede estar compuesto por vectores, matrices o factores es el data frame. Un data frame suele tener la particularidad de que, en caso de matrices, su número de filas deben coinsidir.
Este se crea como:
info_estudiantes <- data.frame(colegio_lista$estudiantes,colegio_lista$calificaciones)
class(info_estudiantes)
#> [1] "data.frame"
info_estudiantes
#> colegio_lista.estudiantes colegio_lista.calificaciones
#> 1 Juan 80
#> 2 Emeraldo 75
#> 3 Manparo 90
#> 4 Manpio 85Santana, J. & Farfán, E. (2014). El arte de programar en R: un lenguaje para la estadística.
Carmona (2007). Curso básico de R.