Estructura de Datos en R

Las estructuras de datos nos dicen como organizar y almacenar los datos que usamos. Tales estructuras van de lo simple a lo compuesto, y se les usa según la necesidad particular. Veamos 3 de estas:

  1. Listas.
  2. Vectores.
  3. Data Frame.

Las Listas y vectores son estructuras simples; un data frame es una compuesta.


Listas

Las listas contienen valores de cualquier tipo simple (numérico o no numérico), y podrían ser estructuras completas (lista de listas). Si usamos como referencia a una hoja de cálculo con datos sobre individuos, una lista podría ser una fila que tiene los datos de los individuos.

DetallePresidente=list(Nombrecompleto="Pedro Castillo",
                   Edad=53,
                   Mujer=FALSE)

El object ‘DetallePresidente’ almacena temporalmente la lista en la computadora. Los nombres pueden contener letras del alfabeto y números (y algunos caracteres de puntuación), pero no debe comenzar con un número.

En el código anterior, solo se ha pedido crear la lista. R lo ejecuta y nada más, no tienes que esperar ningún mensaje ni resultado. Si quieres ver lo que has creado, escribelo de manera explicita, así:

DetallePresidente

Nota que hay varios tipos de datos en la lista:

Para acceder a cada uno de los elemento tu lista:

DetallePresidente[[1]]
# or
DetallePresidente[['Nombrecompleto']]
# or
DetallePresidente$Nombrecompleto

Si quieres cambiar algun valor:

DetallePresidente$Nombrecompleto='Dina Boluarte'
# Ahora tienes:
DetallePresidente

Para añadir elementos:

DetallePresidente$ciudad='Chota'

# Ahora tienes:
DetallePresidente

Para eliminar:

DetallePresidente$Edad=NULL 
# también: DetailStudent[[4]]=NULL

Acabas de eliminar un campo:

DetallePresidente

Si lo que querías era dejarlo vacío

DetallePresidente$ciudad=NA
DetallePresidente

Para eliminar una lista:

lista1=list(1,2,3,4)
rm(lista1) #remueve lista
lista1

EJERCICIO SUGERIDO PARA SEGUIR PRACTICANDO

  1. Crea un objeto tipo lista con tres datos de Perú
  2. Añade dos datos al objeto creado.
  3. Deja vacía alguna de las características.
  4. Elimina alguna de las características.

Ir a inicio


Vectores

Los vectores deben contener un único tipo de datos. En un archivo de datos Excel, un vector puede ser una columna:

nombres=c("Dina Boluarte","Pedro Castillo","Martín Vizcarra","Pedro Pablo Kuczynski")
edades=c(60,53,59,84)
mujer=c(T,F,F,F)

Los tres objectos almacenan temporalmente vectores. Los nombre pueden contener letras del alfabeto y números (y algunos caracteres de puntuación), pero no debe comenzar con un número.

En el código anterior, solo se ha pedido crear los vectores. R lo ejecuta y nada más, no tienes que esperar ningún mensaje ni resultado. Si quieres ver lo que has creado, escribelo de manera explicita, así:

nombres
edades
mujer

Si quieres acceder a ciertos elementos:

nombres[1]
# o tambien
edades[1]
# o tambien
mujer[1]

Podemos alterar el vector de esta manera:

nombres[2]='Pedrito Castillo'
# Entonces:
nombres[2]

Podemos añadir así:

elementos=c(1,2,3)
elementos=c(elementos,40) 
elementos

NULL NO se puede usar para eliminar un elemento:

# estos dará error:
elementos[4]=NULL

Simplemente ‘reduce’ el vector:

# '-' significa 'sin':
elementos=elementos[-4] 

A veces queremos eliminar valores repetidos:

díasdesemana=c('L','M','M','J','V','S','D')
díasdesemana

Para ello tenemos la función unique:

unique(díasdesemana)

Los elementos del vector pueden tener nombres:

nuevasedades=c("Carlos"=50, "Paul"=30, "María"="once")
nuevasedades

Como los elementos tienen que ser del mismo tipo, R acaba de coercionar los otros valores a characters (darse cuenta que los números aparecen entre comillas ’’). Si eliminamos el valor textual, no habrá coerción:

nuevasedades2=c("Carlos"=50, "Paul"=30,"María"=11)
nuevasedades2

Vectores versus Listas

A) Asegurarse qué tenemos:

Usemos str con frecuencia.

caso 1: vector donde los elementos no tienen nombres

#Si tenemos un vector nos dirá qué tiene:
str(elementos)

caso 2: vector donde los elementos tienen nombres, aquí todos han sido coercionados a texto:

str(nuevasedades)

caso 3: vector donde los elementos tienen nombres, aquí no hay coerción:

str(nuevasedades2)

caso 4: cuando hay lista, nos dice que es una lista y de qué tipos son sus elementos:

str(DetallePresidente)

B) Asegúrate que las misma funciones se pueden usar en ambas, y qué se obtiene

listTest=list(1,2,3,3)
vectorTest=c(1,2,3,4)
length(listTest); length(vectorTest)
## [1] 4
## [1] 4

Ir a inicio


Data Frames

Los Data frames pueden interpretarse como estructuras compuestas en base a las simples:

# VECTORES
nombre=c("Chanyeol", "Juan", "Ana", "Nadine")
edad=c(32,33,28,30)
país=c("Corea", "Ecuador", "España", "México")
educación=c("Bachiller", "Licenciado", "Maestría", "PhD")

#DF es una composición de columnas en formato de vector:
DF_vectors=data.frame(nombre,edad,país,educación)
DF_vectors

También podría ser a partir de filas (listas):

# Listas por fila
fila1=list(name="Chanyeol", age=32, country="Corea", deg="Bachiller")
fila2=list(name="Juan", age=33, country="Ecuador", deg="Licenciado")
fila3=list(name="Ana", age=28, country="España", deg="Maestría")
fila4=list(name="Nadine", age=30, country="México", deg="PhD")
# lista de listas
dataLista=list(fila1,fila2,fila3,fila4)

#DF es una composición de listas:
DF_lists=do.call(rbind.data.frame,dataLista)
row.names(DF_lists)=NULL
DF_lists
##       name age country        deg
## 1 Chanyeol  32   Corea  Bachiller
## 2     Juan  33 Ecuador Licenciado
## 3      Ana  28  España   Maestría
## 4   Nadine  30  México        PhD

Tendremos un data frame? Recuerda que str es clave:

str(DF_vectors)
str(DF_lists)

Este DataFrame (DF) tiene algunos problemas, pero por ahora está bien.

Además de str(), es bueno saber que puedes usar:

estudiantes=DF_vectors
# cuantas filas y columnas tienes:
dim(estudiantes)

#Cuantas filas
nrow(estudiantes)  # también puedes usar ncol() 

#Cuantas columnas
length(estudiantes)

El comando length lo hemos usado en vectores y listas. En los DF, te da el número de columnas.

También son muy útiles las funciones head(), que te permite ver las filas al inicio del DF:

head(estudiantes,2) # 2 filas de arriba a abajo

Y su opuesto también está disponible:

tail(estudiantes,2) # 2 filas de abajo a arriba

Es bueno saber qué variables tenemos:

names(estudiantes)

Tu Df es la tabla de datos a la que estás acostumbrado a utilizar. Si quieres ver algun elemento en particular:

# SI [filas,columnas]

## veamos columnas:

# una columna
estudiantes$nombre
# varias columnas (con posiciones)
estudiantes[,c(1,4)]
# varias columnas (con nombres)
estudiantes[,c('nombre','educación')]
# SI [filas,columnas]

## veamos filas:

# una fila
estudiantes[2,]
# varias filas
estudiantes[c(2,3),]

Nótese en los casos anteriores, que si no indicabas filas, tenías toda la fila; y que si no indicas columnas, vienen todas las columnas. Si solo quieres un valor:

estudiantes[1,3]

Es muy común, y necesario, crear subsets del DF:

estudiantes2=estudiantes[,c(1:3)]
estudiantes2

Voy a hacer algunos cambios a este DF. Sin embargo, es común primero crear una copia del original:

estudiantescopia=estudiantes

Ahora, a la copia le hago modificaciones.

Por ejemplo:

# cambio el valor de una edad:
estudiantescopia[1,2]=23
# No hay advertencia, el cambio ya se hizo:
estudiantescopia[1,]

Podemos tener una nueva columna con valores vacios:

estudiantescopia$apellido=NA
estudiantescopia

Y puedo eliminarla con NULL:

estudiantescopia$apellido=NULL
estudiantescopia

CONSULTAS en Data Frames:

Una de las primeras cosas que hacemos con los DF es hacerle consultas (nota el uso de las comas):

¿Quién es el más viejo del grupo?

estudiantes[which.max(estudiantes$edad),] 

¿Quién es el más jóven del grupo?

estudiantes[which.min(estudiantes$edad),] 

****¿Quién tiene más de 30 y es de Corea?**

estudiantes[estudiantes$edad>30 & estudiantes$país=='Corea',] 

****¿Quién no viene de México?**

estudiantes[estudiantes$país!="México",] 

¿Quién no viene de estos lugares?

lugares=c("Corea", "España")
estudiantes[!estudiantes$país %in% lugares,] 

Muéstrame el DF ordenado decrecientemente por edad

estudiantes[order(-estudiantes$edad),]

Muestrame el DF ordenado crecientemente, por educación y luego por edad

estudiantes[order(estudiantes$educación,estudiantes$edad),]