1 of 65

Introducción a R, RStudio y Gestión de Datos en R

Francisco Palm

fpalm@ula.ve

2 of 65

Nota general

  • Esta presentación no es más que una guía para seguir el taller icebreakeR preparado por Andrew Robinson http://www.ms.unimelb.edu.au/~andrewpr/r-users/icebreakeR.pdf
  • Se sugiere tener el texto a mano y seguirlo en detalle. El énfasis de este material está en el uso de R y no tanto en métodos estadísticos.
  • Se espera que sea la base para una guía más elaborada, por lo tanto se agradece cualquier tipo de corrección o sugerencia.

3 of 65

¿Qué es R?

  • Lenguaje de programación para análisis de datos y modelado.
  • Puede usarse como entorno de cómputo estadístico y gráficos y/o lenguaje de programación dinámico.
  • Puede utilizarse en modo interactivo o script.
  • Software Libre, con una amplia comunidad de desarrolladores, investigadores y usuarios.

4 of 65

¿Porqué R?

  • Multiplataforma (corre en Linux, Windows y Mac)
  • Quizás el sistema estadístico más completo en cuanto a técnicas disponibles.
  • Genera gráficos con calidad de publicación.
  • Facilita la generación automática de reportes.
  • Trabaja bien con otros lenguajes.
  • Conveniente para proyectos pequeños y grandes.

5 of 65

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)

6 of 65

La interfaz de RStudio

Cuatro zonas: Editor, Consola, Datos y Ayuda.

Editor

Consola

Datos

Ayuda

7 of 65

Modos de trabajo

  • Se comienza con el modo interactivo (en la consola) haciendo pruebas y utilizándolo como manual de ayuda.
  • La serie de comandos que devuelven los resultados esperados se guardan y modifican (en el editor) como scripts para crear rutinas reproducibles y automatizables.

8 of 65

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.

9 of 65

Estructura de un proyecto

10 of 65

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

11 of 65

Primer contacto

12 of 65

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 [↵]

13 of 65

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

14 of 65

Crear Proyecto (1)

1

2

3

15 of 65

Crear Proyecto (2)

Una vez creado el proyecto

16 of 65

Convenciones

  • Aunque "=" también puede utilizarse para asignaciones, utilice preferentemente "->" o "<-".
  • Utilizar espacios entre argumentos, objetos y operadores aritméticos.
  • Utilizar nombres útiles para los objetos.
  • Aunque se pueden terminar las líneas con punto y coma, no lo haga.

En lugar de:

> ctte=3.2808399;

> x=x/ctte;

Hacer:

> pies_por_metro <- 3.2808399

> altura_m <- altura_p / pies_por_metro

17 of 65

Atajos

  • Puede copiar de otros documentos y pegar en la consola. ¡Cuidado con las comillas y los caracteres especiales!. Tiene que ser "" (ASCII) y no “ ” o “ ”
  • Si en el proyecto tiene los datos en la carpeta data y hace de scripts su directorio de trabajo, ud. sabrá que sus datos siempre estarán en "../data".
  • Puede utilizar la función str(obj) para conocer la estructura de cada objeto.
  • Con la función plot() pueden hacerse con facilidad diagramas de dispersión de los datos.

18 of 65

Vitrina

  • El objetivo es explorar las funcionalidades de R.
  • Desde el sitio http://www.ms.unimelb.edu.au/~andrewpr/r-users/
  • Descargar los conjuntos de datos: ehc.csv, gutten.csv, rugby.csv, stage.csv, ufc.csv y copiarlos en la carpeta data.
  • En la carpeta documents puede colocar las notas del curso icebreakeR.pdf y la presentación intro.pdf

19 of 65

Entrada de datos

  • Se trabajará con un archivo separado por comas (csv) formato común de exportación de EXCEL y BD. Se trata de un inventario forestal.
  • Puede utilizarse ahora directamente el comando:

> ufc <- read.csv("../data/ufc.csv")

  • O en RStudio Workspace -> Import dataset -> From text file... y seleccionar ufc.csv de la carpeta data
  • Se establecen los parámetros de la muestra:

> ufc_baf <- 7

> ufc_area <- 300

20 of 65

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.

21 of 65

Estructura de datos

  • Para conocer la estructura: str(ufc)
  • y los primeros registros con: head(ufc)
  • ufc es un data.frame, una estructura equivalente a una tabla de una base de datos, con otras propiedades y funciones convenientes.
  • Es posible aplicar funciones a lo largo de la tabla. Por ejemplo: colSums(is.na(ufc)) calcula la suma de cada columna colSums() para la ocurrencia de valores faltantes is.na().

22 of 65

Estructuras de datos

23 of 65

Manipulación de datos

  • Se puede acceder a las columnas de un data frame mediante el operador $. Por ejemplo, ufc$plot hace referencia a la columna o campo plot del data frame ufc.
  • También puede usarse para añadir nuevas columnas al data frame:

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

24 of 65

Manipulación de datos

25 of 65

Resumen de datos (1)

  • Recordemos que cada columna es un vector
  • Sobre estos vectores pueden aplicarse las funciones de R de estadísticas descriptivas como range().

> range(ufc$dbh_cm)

  • Si un vector tiene valores faltantes NA, tomará estos como mínimos y máximos. Se pueden eliminar los valores NA con la opción na.rm = TRUE

> range(ufc$height_m, na.rm = TRUE)

26 of 65

Resumen de datos (2)

  • En este caso, un valor igual a cero no tiene sentido, de modo que se establece como faltante

> ufc$height_m[ufc$height_m < 0.1] <- NA

  • Si dentro de los corchetes "[]" hay una expresión lógica, esta servirá para aplicar un filtro. En este caso, "asigna NA a los valores menores que 0.1".
  • Así, se han marcado como faltantes los valores erróneos.

> range(ufc$height_m, na.rm = TRUE)

27 of 65

Resumen de datos (3)

  • La función table() genera tablas de frecuencia. Dado que la columna ufc$species es un factor (categoría), podemos hacer:

> table(ufc$species)

  • El resultado puede mostrar errores de transcripción, por ejemplo "F" y "FG" se recodifican a "GF"

> ufc$species[ufc$species %in% c("F", "FG")] <- "GF"

> ufc$species <- factor(ufc$species)

  • Es importante reestablecer esta columna como factor(). Puede verse la nueva tabla de frecuencias y con los valores faltantes en height_m.

> table(ufc$species)

> table(ufc$species[is.na(ufc$height_m)])

28 of 65

Resumen de datos (4)

29 of 65

Resumen de datos (5)

  • Es sencillo generar gráficos con distintas funciones boxplot() para diagramas de caja, scatter.smooth() para diagramas de dispersión con ajuste, e hist() para histogramas.

> 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 = "")

  • dbh_cm ~ species denota un modelo estadístico donde dbh_cm es la respuesta en función de species. El resto de argumentos configuran propiedades como las etiquetas y los cortes de los ejes.

30 of 65

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

31 of 65

Estimaciones condicionales

  • La familia de funciones apply: apply(), lapply(), sapply(), tapply() y vapply() permiten aplicar funciones sobre objetos de R.

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

  • De igual manera,

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

32 of 65

Modelos

  • Para obtener un modelo lineal de height_m en función de dbh_cm, se podría hacer.

hd_lm_1 <- lm(height_m ~ dbh_cm, data = ufc)

  • hd_lm_1 representa el modelo generado mediante regresión lineal. La función summary() ofrece un reporte básico del ajuste.
  • Es posible comparar gráficamente un ajuste suavizado con el modelo lineal:

> scatter.smooth(ufc$dbh_cm, ufc$height_m)

> abline(hd_lm_1, col = "red")

33 of 65

Modelos (2)

34 of 65

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:

  • Un diagrama de dispersión (puntos del fondo)
  • El modelo lineal para la especie en azul
  • El modelo lineal general en verde oscuro
  • Si hay menos de dos faltantes, el ajuste polinómico en rojo.

35 of 65

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.

36 of 65

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.

37 of 65

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

38 of 65

Ejercicio de ayuda

  1. Consultar la ayuda para los siguientes comandos de R: length(), seq(), table() y expand.grid()
  2. ¿Cómo podría hacer para encontrar la correlación entre las alturas height_m y los diámetros de los árboles dbf_cm?
  3. Encuentre las funciones para realizar la "Estimación Kernel de la densidad", "Análisis de Componentes Principales".

Observaciones: Google, Google translate y la Wikipedia son tus amigos. Piérdele miedo al inglés.

39 of 65

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:

  • Jacknife
  • Bootstrap
  • ¿Cuántos artículos ha hecho Douglas Bates sobre p-values?

40 of 65

Editar scripts

  1. En RStudio, abra un nuevo editor desde�File->New->R Script o con Ctrl+Shift+N
  2. Edite una corta descripción con su nombre y el propósito del documento. Utilice # al inicio de cada línea
  3. Escriba varios de los comandos utilizados hasta ahora. Introduzca comentarios.
  4. Utilice la barra de herramientas del editor para ejecutar el código del editor, ya sea línea por línea (Ctrl+Enter) o por región seleccionada (Ctrl+Shift+P)
  5. Ejecute el script completo sin "eco" (Ctrl+Shift+S) o con "eco" (Ctrl+Shift+Enter).

41 of 65

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:

  • ls() para obtener una lista de los objetos.
  • save.image(arch) para guardar todos los objetos en el archivo arch
  • save(obj, arch) para guardar solamente el objeto obj
  • rm(obj) para borrar objetos de la memoria
  • load(arch) para cargar objetos desde un disco.

42 of 65

Ejercicio Workspace

  1. Guardar todos los objetos existentes en la imagen temp.RData
  2. Vacíe su espacio de trabajo.
  3. Convierta un metro cúbico en pies-tabla, haciendo:�board.feet.per.cubic.meter <- 3.2808399^3 * 12
  4. Guarde a una imagen de nombre conversions.RData
  5. Vacíe su espacio de trabajo
  6. Recargue sus objetos originales y listelos.

Nota: En cada espacio observe los cambios en la pestaña Workspace

43 of 65

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.

44 of 65

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!

45 of 65

Archivos en RStudio

Herramienta para importar datos

Gestor de archivos integrado

46 of 65

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.

47 of 65

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.

48 of 65

Ejercicios I/O

  • Utilice la función read.csv() y la herramienta Import Data Set... de RStudio para importar los archivos ufc.csv y stage.csv
  • Guarde el archivo stage.csv como el archivo mydata.csv. Esto es, guardar en disco el objeto en memoria con los datos de stage.csv
  • Genere un gráfico hacia un dispositivo como png() o svg() e impórtelo en un documento de su procesador de palabras favorito.

49 of 65

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"

50 of 65

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"

51 of 65

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"

  • Utilice el código anterior como referencia para familiarizarse con la creación y destrucción de objetos, y verificar y cambiar su clase. Observe los cambios en el control "Workspace" de RStudio.

52 of 65

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.

  • Ejecute las sentencias de la sección 6.2, preste atención a los cambios en el control "Workspace" de RStudio.

53 of 65

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: arreglos unidimensionales de objetos.
  • dataframe: tablas bidimensionales.
  • matrices: vector gestionado como un arreglo multidimensional.
  • listas: contenedor de objetos de cualquier tipo.

54 of 65

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.

55 of 65

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.

  • Ejecute el ejemplo de las págs 37 y 38 de icebreakeR.

56 of 65

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.

57 of 65

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.

58 of 65

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.

59 of 65

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.

60 of 65

Ejercicios dataframe (1)

  1. Asegúrese de haber ejecutado todo el código desde la p. 39.
  2. Ahora, vamos a intentar algo un poco más complicado. ¿Cómo podríamos preguntar: ¿cuáles son las especies de los tres árboles más altos? Lo mejor es construir este comando por partes. Tenga en cuenta que somos capaces de anidar los subíndices. R comienza desde la izquierda y se abre camino hacia la derecha
    1. order(ufc$height.m, decreasing = TRUE) devuelve los índices de las observaciones en orden decreciente de altura.
    2. ufc$species[order(ufc$height.m, decreasing = TRUE)] devuelve las especies correspondientes a esas alturas.
    3. ufc$species[order(ufc$height.m, decreasing = TRUE)][1:3] ofrece sólo los tres primeros.

> 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)?

  • El siguiente comando útil es tapply(). Esta pequeña y encantadora función nos permite vectorizar la aplicación de ciertas funciones a grupos de datos (no vacíos). Usado junto a factores, se convierte en código excepcionalmente eficiente. tapply() requiere tres cosas: el vector de destino en el que la función se aplica, el vector por el cual se agrupan el vector de destino, y la función a ser aplicada. Todos los otros argumentos que desea pasar a la función se anexan a la llamada a tapply(). Esto es,

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

61 of 65

Ejercicios dataframe (2)

  1. ¿Cuál es la media de los diámetros por especies?
  2. ¿Cuáles son las dos especies que tienen los mayores diámetros de tercer cuartil?. Utilice las herramientas que ya han visto en este taller para averiguar lo que hay que hacer para calcular los cuartiles.
  3. ¿Cuáles son las dos especies con la mayor mediana del cociente de esbeltez (altura / diámetro)?, y ¿qué hay de las dos especies con la menor mediana del cociente de esbeltez?
  4. ¿Cuáles son los dos árboles con los mayores cocientes de esbeltez? y ¿qué hay de los dos árboles con los menores cocientes de esbeltez?
  5. ¿Cuál es el cociente de esbeltez del árbol más alto? ¿y el más grueso?

62 of 65

Ejercicios dataframe (3)

  • Vamos a intentar algo más complicado todavía. ¿Cómo podemos obtener la identidad del árbol con la mediana de la altura dentro de su especie, la cual es la octava por altura promedio? Es decir, identificar el árbol (si existe) que tiene la mediana de la altura entre todos los árboles de la especie que tiene la octava mayor altura promedio? Ok eso es ridículo, pero vamos a estirar el lenguaje. Una vez más, es más fácil de trabajar y revisar nuestro trabajo paso a paso.�Tenga en cuenta que la colocación los paréntesis alrededor de una sentencia es abreviatura de "calcular esto y luego imprimirlo ".
    1. En primer lugar obtener la altura promedio por especie.�> (ht.bar.by.species <- tapply(ufc$height.m, ufc$species, mean, na.rm = TRUE))
    2. A continuación, obtener el orden del índice de las especies, ordenado por la altura promedio�> (species.order.by.ht <- order(ht.bar.by.species, decreasing = TRUE))
    3. Los nombres de las especies ordenados por la altura promedio serían:�> (species.by.ht <- levels(ufc$species)[species.order.by.ht])
    4. El octavo más alto es:�> (sp.8 <- species.by.ht[8])
    5. La mediana de las alturas de todos los árboles de esa especie es entonces:�> (m.ht.8 <- median(ufc$height.m[ufc$species == sp.8], na.rm = TRUE))
    6. El árbol de esa especie con la altura dada es:�> ufc[which(ufc$height.m == m.ht.8 & ufc$species == sp.8), ]

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?

63 of 65

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.

64 of 65

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.

65 of 65

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.