Introducción a R, RStudio y Gestión de Datos en R
Francisco Palm
fpalm@ula.ve
Nota general
¿Qué es R?
¿Porqué R?
Empezar con R (Windows)
Descarga,
http://cran.r-project.org/bin/windows/base/
Descargar el enlace donde dice:
Download R X.XX.X for Windows,
X.XX.X es la versión de R más reciente. Ahora es 2.15.0
RStudio, interfaz gráfica mejorada
Desde el sitio: http://rstudio.org/download/desktop
Descargar la versión más reciente (RStudio 0.96.304)
La interfaz de RStudio
Cuatro zonas: Editor, Consola, Datos y Ayuda.
Editor
Consola
Datos
Ayuda
Modos de trabajo
Estructura de un proyecto
El libro icebreakeR recomienda que cada proyecto tenga las carpetas (puede traducir los nombres si quiere):
data, documents, graphics, images, notes, scripts
Crear una carpeta de proyecto para el curso y dentro de esta crear las carpetas anteriores.
Estructura de un proyecto
Primer contacto
Ejecutar RStudio en su sistema.
Por defecto no aparece el editor al lado izquierdo, solamente el terminal.
Ejecutar allí:
> 1 + 1 [↵]
> 3 * 3 [↵]
> pi [↵]
pulse [↑] ¿Qué sucede? Trate de editar y re-ejecutar un comando anterior
Salga ejecutando q()
Primer contacto
Directorio de trabajo
Es la carpeta desde donde trabajará R.
Ejecutar(*):
> getwd() # get working directory
Para obtener el directorio de trabajo actual.
> setwd("new_wd") # set new working dir
Para establecer (set) el nuevo directorio de trabajo.
setwd() es una función, y "new_wd" un argumento de esa función que indica que hará. El texto después de # es un "comentario" y no afecta la operación.
(*) De ahora en adelante se sobreentiende�que "ejecutar" implica escribir/pegar en la�consola y pulsar [↵]
Control de directorios
En RStudio es recomendable gestionar los archivos bajo un proyecto.
Seleccione Project->New Project y en el menú emergente elija Existing Directory e introduzca la carpeta que contiene las carpetas data, documents, graphics, etc.
Establezca la carpeta scripts de su proyecto como el nuevo directorio de trabajo.
Esto puede hacerlo en RStudio desde el menú Tools->Set Working Directory->Choose Directory o directamente con Ctrl+Shift+K
Crear Proyecto (1)
1
2
3
Crear Proyecto (2)
Una vez creado el proyecto
Convenciones
En lugar de:
> ctte=3.2808399;
> x=x/ctte;
Hacer:
> pies_por_metro <- 3.2808399
> altura_m <- altura_p / pies_por_metro
Atajos
Vitrina
Entrada de datos
> ufc <- read.csv("../data/ufc.csv")
> ufc_baf <- 7
> ufc_area <- 300
Entrada de datos
Se puede acceder a los datos desde la consola o usando la opción Import Dataset.
Una vez cargados formarán parte del "Workspace" de R.
Estructura de datos
Estructuras de datos
Manipulación de datos
> ufc$height_m <- ufc$height/10
> ufc$dbh_cm <- ufc$dbh/10
En este caso se calculan a partir de las existentes de los existentes nuevas columnas. Donde cada columna es un vector de valores.
Manipulación de datos
Resumen de datos (1)
> range(ufc$dbh_cm)
> range(ufc$height_m, na.rm = TRUE)
Resumen de datos (2)
> ufc$height_m[ufc$height_m < 0.1] <- NA
> range(ufc$height_m, na.rm = TRUE)
Resumen de datos (3)
> table(ufc$species)
> ufc$species[ufc$species %in% c("F", "FG")] <- "GF"
> ufc$species <- factor(ufc$species)
> table(ufc$species)
> table(ufc$species[is.na(ufc$height_m)])
Resumen de datos (4)
Resumen de datos (5)
> boxplot(dbh_cm ~ species, data = ufc, ylab = "Dbh (cm)")
> boxplot(height_m ~ species, data = ufc, ylab = "Height (m)")
> scatter.smooth(ufc$dbh_cm, ufc$height_m)
> hist(ufc$dbh_cm, breaks = (0:50) * 2.5, col = "darkseagreen3",
+ main = "")
Resumen de datos (6)
Al generarse los gráficos aparecen en la pestaña Plots
Se puede navegar entre los gráficos, y exportarlos con la barra de herramientas
Estimaciones condicionales
> tapply(ufc$dbh_cm, ufc$species, length)
aplica la función length() (conteo de valores) sobre la columna dbh_cm para cada factor de species.
> tapply(ufc$dbh_cm, ufc$species, mean)
calcula la media de dbh_cm para cada especie.
Compare con los resultados de la función table().
Modelos
hd_lm_1 <- lm(height_m ~ dbh_cm, data = ufc)
> scatter.smooth(ufc$dbh_cm, ufc$height_m)
> abline(hd_lm_1, col = "red")
Modelos (2)
Modelos (3)
Gráfico de altura en función del diámetro a la altura del pecho (dbh) para cada especie height_m ~ dbh_m | species
Cada panel tiene:
El resto de la vitrina...
Son en realidad operaciones tan complejas que no tiene sentido en este punto entrar en explicaciones.
Se sugiere ejecutar línea a línea el código de las secciones 3.5 Functions y 3.6 Plot Level Processing. Incluso pegar el código en el editor, y modificar en la medida que sea necesario.
Si genera muchas dudas recomiendo pasar de largo y volver más tarde.
Obtener ayuda
Se puede obtener ayuda desde la consola con la función help() o el operador ?.
> ?mean # Funciona! mean() es un comando de R
> help(mean) # Funciona! mean() es un comando de R
Para búsqueda por palabras clave se puede utilizar el operador ?? o la función help.search().
> ??regression
> help.search("regression")
En RStudio se utiliza la ayuda integrada en la pestaña help de la esquina inferior derecha.
Ayuda en RStudio
Los resultados de la ayuda aparecen automáticamente en el área de ayuda.
También se puede buscar directamente por palabras clave en la caja de búsqueda.
Y navegar entre los resultados
Ejercicio de ayuda
Observaciones: Google, Google translate y la Wikipedia son tus amigos. Piérdele miedo al inglés.
Búsqueda remota
Para hacer una búsqueda en el sitio de R desde la consola puede utilizar la función RSiteSearch(texto).
> RSiteSearch("Bates lmer") # Douglas Bates sobre lmer
> RSiteSearch("{logistic regression}") # Coincidencia exacta
Ejercicio
Encontrar en el sitio de R lo siguiente:
Editar scripts
Espacios de trabajo
Un workspace en R es el nombre que recibe el gestor de todos los objetos en memoria.
En RStudio puede gestionarse desde la pestaña Workspace en la esquina superior derecha.
Las funciones básicas son:
Ejercicio Workspace
Nota: En cada espacio observe los cambios en la pestaña Workspace
Historia
La herramienta history de R permite hacer un seguimiento de todos los cambios de la sesión de trabajo.
> savehistory("arch.txt") # guarda como texto plano
> loadhistory("arch.txt") # carga la historia
En RStudio se puede gestionar la historia desde la pestaña History de la esquina superior derecha, y se pueden enviar directamente líneas de código de la historia ya sea a la consola o el editor.
Como ejercicio ejecute varios comandos y revise los contenidos de la historia con [↑] y [↓]
Verifique los cambios en la pestaña History de RStudio.
Importar/Exportar Datos
La información en hojas de cálculo y bases de datos puede exportarse en archivos separados por comas (.csv). Y otros formatos similares de archivos de texto.
Con list.files() puede revisarse el contenido de una carpeta.
> setwd("~/Proyectos/quickstarteR/scripts")
> list.files("../data")
RStudio provee la herramienta Workspace->Import Dataset->From Text File...
Para importar datos desde archivos de texto.
¡Y un explorador de archivos en la pestaña Files de la esquina inferior derecha!
Archivos en RStudio
Herramienta para importar datos
Gestor de archivos integrado
Importar Datos
Básicamente se quiere importar tablas de datos. Si se desean importar datos de una hoja de cálculo estos deben estar organizados como una tabla, preferiblemente con etiquetas en la cabecera de las columnas y un registro completo por fila.
Es muy recomendable contar con un símbolo para indicar los valores faltantes.
La función en general para leer de archivos de texto es read.table(), la cual tiene una versión especializada para archivos csv read.csv()
La función names() aplicada a un data frame devuelve un vector con los nombres de las columnas/campos, y permite acceder a estos nombres para modificarlos.
Exportar Datos
Se puede guardar un data frame como un archivo separado por comas con la función write.csv(dataframe,archivo)
Cambiando el dispositivo de salida con funciones como pdf(), png() o svg(), permite guardar los resultados en un archivo con estos formatos hasta encontrar un llamado a dev.off()
En http://www.statmethods.net/input/index.html puede encontrarse un buen resumen de funciones para importar y exportar datos.
Ejercicios I/O
R es Orientado a Objetos
El analista interacciona con R mediante objetos, esto es, nombres que comprenden tanto datos como funciones.
Se crean objetos al asignar valores a un nombre usando el operador <-
> a <- 1.5 # crea el objeto "a"
Los objetos son miembros de una categoría, a la que se denomina "clase".
> class(a) # ¿A cuál clase pertenece "a"?
[1] "numeric"
Si asigno un nombre de clase a class() puedo intentar cambiar la clase del objeto.
> class(a) <- "character"
R es OO (2)
Cada vez que asigno un nuevo valor a un nombre se borra su anterior contenido.
Si se asigna a un nombre a otro nombre se está copiando su valor
> a <- "Pablo" # Ahora es "character"
> b <- a # "b" contiene el valor "Pablo"
> a <- 1:3 # Ahora "a" es un vector
En RStudio se pueden constatar los cambios a los objetos desde el control "Workspace"
Con mucha frecuencia se asigna a un nombre el resultado de una función o un combinación de variables.
> b <- mean(a) # "b" es el promedio de "a"
Ejercicio OO
Recordemos que es posible listar los objetos en memoria con ls()
> ls()
[1] "a" "b"
Y borrar objetos de la memoria con rm()
> rm(b)
> ls()
[1] "a"
Clases de Datos
Las clases básicas de datos en R son numeric, character, factor, logical y na (datos faltantes).
Se puede verificar la clase de un objeto mediante is.-clase-()y cambiar el tipo usando as.-clase-(). Donde -clase- puede sustituirse por numeric, factor, logical o na.
La clase factor es utilizada por R para clasificar objetos de acuerdo a distintos niveles (levels).
Un valor logical es un factor con niveles TRUE o FALSE según se satisface o no alguna condición.
Estructuras de Datos
Son mecanismos para la manipulación de objetos agrupados que pueden ser de cualquiera de las clases anteriores.
Las estructuras de datos básicas de R son 4:
Vectores
Se crean vectores con la función c() (combinar) y otras funciones de conveniencia como seq() para secuencias, rep() para valores repetidos, o el operador : para rangos, y combinaciones de todos estos:
> c(rep(4,3),seq(3,10,3),1:5,34,35,c(4,5))
[1] 4 4 4 3 6 9 1 2 3 4 5 34 35 4 5
Seguir los comandos de la sección 6.3.1. muestran como acceder a los elementos del vector (en una posición, en posiciones y orden arbitrarios), aplicar funciones básicas como length(), order() y which(), y filtros introduciendo condiciones como subíndices. Considere que se introdujo b <- 4 siguiendo los comandos de secciones anteriores.
Vectorización
Consiste en utilizar funciones optimizadas para sustituir los lazos de repetición. Los lenguajes de programación interpretados son poco eficientes ejecutando bucles.
En R, como regla general, las operaciones sobre los vectores aplican a todo el vector. Así, el bucle:
for (i in 1:length(diameters)) {
basal.areas[i] <- diameters[i]^2 * pi / 40000
}
Es equivalente a:
basal.areas <- diameters^2 * pi / 40000
Sin embargo, este último código es mucho más eficiente computacionalmente.
Reciclado
Para facilitar las operaciones con vectores, R extiende automáticamente los objetos de menor longitud para hacerlos corresponder.
Por ejemplo:
> c(1, 2, 3, 4, 5, 6) * c(1, 2)
[1] 1 4 3 8 5 12
En este caso, c(1, 2) se extiende a c(1, 2, 1, 2, 1, 2), para tener la misma longitud que el otro vector.
Es importante tener mucho cuidado con este característica, aunque es con frecuencia útil también puede generar resultados inesperados.
Ejercicios con vectores
Cree un vector de tres diámetros (in cm), digamos,
> diameters <- c(26.4, 43.7, 56.0, 33.5)
1. Convierta todos a área basal (g, in m2 ) en un comando
g = π d² / 40000
2. Encuentre la mayor área basal.
3. Encuentre la posición en el vector de la mayor área basal.
Dataframe
Es una estructura bidimensional que emula una tabla de una base de datos, donde las columnas representan variables o campos, y cada fila una observación o registro.
Se puede ver como una matriz de valores a los que se puede acceder y aplicar filtros por sus subíndices de forma similar a los vectores.
Es posible acceder a cada columna con la notación dataframe$columna y el resultado será un vector con todas sus propiedades.
sapply
Función de la familia de funciones apply() que permite aplicar una función a las columnas de un dataframe.
Por ejemplo:
> sapply(ufc[, 4:7], mean, na.rm = TRUE)
dbh height dbh.cm height.m
356.56619 240.66496 35.65662 24.06650
Calcula la media para las columnas 4, 5, 6 y 7 de ufc.
Ejercicios dataframe (1)
> ufc$species[order(ufc$height.m, decreasing = TRUE)][1:3]
Ahora, ¿cuáles son las especies de los cinco árboles más gordos (con el mayor diámetro)?
> tapply(<variable>, <grupo>, <función>, <argumento.2>, <argumento.3>, ...)
Nótese que la <variable> se utilizará como <argumento.1>.
> tapply (ufc$height.m, ufc$species, mean)
Ah. Faltan muchas alturas, haciendo que también la media del reporte aparezca faltante. Vamos a arreglarlo indicando a la media que ignore temporalmente los valores que faltan.
> tapply (ufc$height.m, ufc$species, mean, na.rm = TRUE)
Y vamos a embellecerlo un poco.
> format(tapply(ufc$height.m, ufc$species, mean, na.rm = TRUE), dig = 3)
Ejercicios dataframe (2)
Ejercicios dataframe (3)
Estas cosas deben ser abordados de manera estratégica. Si seguimos una política rigurosa de nombres a continuación, estos objetos se convierten en herramientas vitales intermedios de depuración también. Por supuesto, todo esto se puede expresar como una sola operación (ver en el documento).
Pero sería absurdo.
10. ¿Cuál es la identidad del árbol más alto de la especie que era la más gruesa en promedio?
Matrices
Es un vector con atributos adicionales para ser manipulado como un arreglo multidimensional.
Además, se dispone de funciones especializadas como solve() inversa, t() transponer, det() determinante, qr() descomposición QR, eigen() autovalores y svd() descomposición en valores singulares.
La función apply puede utilizarse para aplicar fácilmente una función a todos los elementos de la matriz a lo largo de filas o columnas.
Listas
Son contenedores de objetos, es útil para agrupar objetos de distintos tipos y dimensiones.
Los elementos pueden accederse mediante dobles corchetes [[]] y con corchetes simples se obtiene una lista que contiene el elemento.
Si se asignan nombres a los elementos se puede acceder a los mismos con la notación lista$nombre.
lapply() aplica una función a todos los elementos de una lista, y devuelve una lista. sapply() devuelve resultados simplificados en vectores o matrices si es posible.
Mezclar, modelar, ordenar
merge() permite mezclar dos dataframes por columnas comunes o nombres de filas. Además de otras sentencias tipo join de bases de datos.
reshape() permite cambiar el manejo de observaciones repetidas entre el formato "ancho" en columnas separadas, o formato "largo" en registros separados.
order() ordena los valores de un dataframe de acuerdo a una o más columnas. sort() y rank() aplican sobre un único índice.