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 segun la necesidad particular. Veamos 3 de estas:
Las Listas y vectores son estructuras simples; un data frame es una compuestas.
Las listas contienen valores de cualquier tipo simple (numerico o no numérico), y podrÃan ser estructuras completas (lista de listas). Si usamos como referencia a una hoja de calculo con datos sobre individuos, una lista podria ser una fila que tiene los datos de los individuos.
DetailStudent=list(fullName="Fred Meyers",
age=40,
female=FALSE)
El object ‘DetailStudent’ almacena temporalmente la lista en la computadora. 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 codigo anterior, solo se ha pedido crear la lista. R lo ejecuta y nada mas, no tienes que esperar ningun mensaje ni resultado. Si quieres ver lo que has creado, escribelo de manera explicita, asÃ:
DetailStudent
Nota que hay varios tipos de datos en la lista:
Para acceder a cada uno de los elemento tu lista:
DetailStudent[[1]]
# or
DetailStudent[['fullName']]
# or
DetailStudent$fullName
Si quieres cambiar algun valor:
DetailStudent$fullName='Alfred Mayer'
# Ahora tienes:
DetailStudent
Para añadir elementos:
DetailStudent$city='Seattle'
# Ahora tienes:
DetailStudent
Para eliminar:
DetailStudent$city=NULL
# también: DetailStudent[[4]]=NULL
Acabas de eliminar un campo:
DetailStudent
Si lo que querias era dejarlo vacÃo
DetailStudent$city=NA
DetailStudent
Para eliminar una lista:
lista1=list(1,2,3,4)
rm(lista1)
lista1
EJERCICIO
Los vectores deben contener un único tipo de datos. En un archivo de datos Excel, un vector puede ser una columna:
names=c("Fred Meyers","Sarah Jones", "Lou Ferrigno","Sky Turner")
ages=c(40,35, 60,77)
female=c(F,T,T,T)
Los tres objectos almacenas temporalmente listas. 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 codigo anterior, solo se ha pedido crear los vectores. R lo ejecuta y nada mas, no tienes que esperar ningun mensaje ni resultado. Si quieres ver lo que has creado, escribelo de manera explicita, asÃ:
names
ages
female
Si quieres acceder a ciertos elementos:
names[1]
# o tambien
ages[1]
# o tambien
female[1]
Podemos alterar el vector de esta manera:
names[1]='Alfred Mayer'
# Entonces:
names[1]
Podemos añadir asÃ:
elements=c(1,2,3)
elements=c(elements,40)
elements
NULL NO se puede usar para eliminar un elemento:
# estos dará error:
elements[4]=NULL
Simplemente ‘encoje’ el vector:
# '-' significa 'sin':
elements=elements[-4]
A veces queremos eliminar valores repetidos:
weekdays=c('M','T','W','Th','S','Su','Su')
weekdays
Para ello tenemos la función unique:
unique(weekdays)
Los elementos del vector pueden tener nombres:
newAges=c("Sam"=50, "Paul"=30, "Jim"="ten")
newAges
Como los elementos tienen que ser del mismo tipo, R acaba de coercionar los otros valores a characters (darse cuenta que los números apareces entre comillas ’’). Si eliminamos el valor textual, no habrá coerción:
newAgesGood=c("Sam"=50, "Paul"=30,"Jim"=10)
newAgesGood
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(elements)
caso 2: vector donde los elementos tienen nombres, aqui todos han sido coercionados a texto:
str(newAges)
caso 3: vector donde los elementos tienen nombres, aqui no hay coerción:
str(newAgesGood)
caso 4: cuando hay lista, nos dice que es una lista y de qué tipos son sus elementos:
str(DetailStudent)
B) Asegurate 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,4)
length(listTest); length(vectorTest)
## [1] 4
## [1] 5
Los Data frames pueden interpretarse como estructuras compuestas en base a las simples:
# VECTORES
names=c("Qing", "Françoise", "Raúl", "Bjork")
ages=c(32,33,28,30)
country=c("China", "Senegal", "Spain", "Norway")
education=c("Bach", "Bach", "Master", "PhD")
#DF es una composición de columnas en formato de vector:
DF_vectors=data.frame(names,ages,country,education)
DF_vectors
También podrÃa ser a partir de filas:
# Listas por fila
row1=list(name="Qing", age=32, country="China", deg="Bach")
row2=list(name="Françoise", age=33, country="Senegal", deg="Bach")
row3=list(name="Raúl", age=28, country="Spain", deg="Master")
row4=list(name="Bjork", age=30, country="Norway", deg="PhD")
# lista de listas
dataList=list(row1,row2,row3,row4)
#DF es una composición de listas:
DF_lists=do.call(rbind.data.frame,dataList)
row.names(DF_lists)=NULL
DF_lists
## name age country deg
## 1 Qing 32 China Bach
## 2 Françoise 33 Senegal Bach
## 3 Raúl 28 Spain Master
## 4 Bjork 30 Norway 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:
students=DF_vectors
# cuantas filas y columnas tienes:
dim(students)
#Cuantas filas
nrow(students) # we have ncol() too!
#Cuantas columnas
length(students)
El comando length lo hemos usado en vectores and listas. En los DF, te da el numero de columnas.
También son muy útiles las funciones head(), que te permite ver las filas al inicio del DF:
head(students,2) # 2 filas de arriba a abajo
Y su antónimo también está disponible:
tail(students,2) # 2 filas de abajo a arriba
Claro que es bueno saber qué variables tenemos:
names(students)
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
students$names
# varias columnas (con posiciones)
students[,c(1,4)]
# varias columnas (con nombres)
students[,c('names','education')]
# SI [filas,columnas]
## veamos filas:
# una fila
students[2,]
# varias filas
students[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:
students[1,3]
Es muy común, y necesario, crear subsets del DF:
studentsNoEd=students[,c(1:3)]
studentsNoEd
Voy a hacer algunos cambios a este DF. Sin embargo, es común primero crear una copia del original:
studentsCopy=students
Ahora, a la copia le hago modificaciones.
Por ejemplo:
# cambio el valor de una edad:
studentsCopy[1,2]=23
# No hay advertencia, el cambio ya se hizo:
studentsCopy[1,]
Podemos tener una nueva columna con valores vacios:
studentsCopy$lastName=NA
studentsCopy
Y puedo eliminarla con NULL:
studentsCopy$lastName=NULL
studentsCopy
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?
students[which.max(students$ages),]
¿Quién es el más jóven del grupo?
students[which.min(students$ages),]
****¿Quién tiene más de 30 y es de China?**
students[students$ages>30 & students$country=='China',]
****¿Quién no viene de Noruega?**
students[students$country!="Norway",]
¿Quién no viene de estos lugares?
places=c("China", "Spain")
students[!students$country %in% places,]
Muestrame el DF ordenado decrecientemente por edad
students[order(-students$ages),]
Muestrame el DF ordenado crecientemente, por educacion y luego por edad
students[order(students$education,students$ages),]
AUSPICIO:
El desarrollo de estos contenidos ha sido posible gracias al grant del Berkeley Initiative for Transparency in the Social Sciences (BITSS) at the Center for Effective Global Action (CEGA) at the University of California, Berkeley
RECONOCIMIENTO
El autor reconoce el apoyo que el eScience Institute de la Universidad de Washington le ha brindado desde el 2015 para desarrollar su investigación en Ciencia de Datos.