Herramientas Computacionales
para la Investigación Interdisciplinaria Reproducible


Sesión 2: Introducción al R

Part A: 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 segun 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 compuestas.


Listas

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

  1. Crea un objeto tipo lista con tu tres datos tuyos.
  2. Añade dos datos tuyos al objeto creado.
  3. Deja vacía alguna de tus características.
  4. Elimina alguna de tus 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:

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

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

Ir a inicio


Data Frames

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

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?

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.