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:
Las Listas y vectores son estructuras simples; un data frame es una compuesta.
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
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
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
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
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),]