Clases de objetos y tipo de datos

Jose A. Vargas

2022-07-12

Introducción

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.

Primera sección con R: operaciones aritmeticas

Entre las múltiples funcionalidades de R, este se puede utilizar para realizar operaciones aritméticas, tales como:

- Suma y resta

2 + 2
#> [1] 4
7 - 5
#> [1] 2

- Multiplicación

10*3
#> [1] 30

- División

45/3
#> [1] 15

Asignación de valor a una variable

La 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] 5

En 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] 2

Para 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)

Tipos de datos básicos R

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 <- FALSE

Para 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"

Vectores definición y manipulación

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:5

Una 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.4

Se 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.7

De 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.0

Para verificar la longitud de un vector se puede utilizar la funcion length().

length(x)
#> [1] 5

Al 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"

Factores

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 m

Otro 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 m

Para 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 5

En 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 1

Aplicación 1: estadísticas descriptivas R

Supongamos 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) <- dias

Una 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.23003

Matrices

Las 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.

Contruccón de metrices

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   20

Tambié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  150000

Los 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] 350000

Aplicación 2. Algebra de matrices

Las 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   22

Propiedades 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 FALSE

Sistemas 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] TRUE

Lista y data frame

Lista

Todos 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 3

Como 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 85

Acceder 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"

Data frame

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                           85

Referencias

Santana, J. & Farfán, E. (2014). El arte de programar en R: un lenguaje para la estadística.

Carmona (2007). Curso básico de R.