# Parte 1
# Ejercicio 1.
seq(1, 40, by = 2)
# Ejercicio 2
seq(1, 40, by = -2)
# Este código da error porque especifiqué algo mal :)Análisis de datos con R
Ejercicios de introducción a R
Estos ejercicios tendréis que entregarlos para la evaluación del curso. Para ello, crea un script de R con RStudio. Ponle el nombre Ejercicios_t1.R. Dicho script deberá estar organizado con comentarios en castellano (poniendo una almohadilla # delante) y justo detrás el código necesario para realizar el ejercicio (ver ejemplo debajo). Además, si el ejercicio pide reflexionar sobre el resultado usa los comentarios (con la #) para indicar tus reflexiones/conclusiones debajo del código. Una vez los tengáis completos deberéis subirlos en la actividad correspondiente de Moodle.
Parte 1: Trabajando con vectores
1. Como muchas funciones en R, seq() es flexible y puede trabajar de formas muy diferentes. Merece la pena entender cómo y porqué funciona de la forma en la que lo hace. Prueba los siguientes comandos y explica debajo de cada uno de ellos cual es el resultado y porqué crees que devuelve dicho resultado:
seq()
seq(0, 5)
seq(from = 0, to = 5)
seq(to = 5)
seq(to = 5, by = 0.5)
seq(from = 10, to = 1, length.out = 10)
seq(from = 5, to = 1, by = -2)
seq(from = 5, to = 1, by = 2)2. Fijaros que se pueden pasar argumentos a una función en R ya sea por su nombre (por ejemplo, to = 5 o by = 0.1), o simplemente colocando los parámetros en el orden correcto. La función seq() espera que le des argumentos en el orden (from, to, by). Puedes averiguarlo revisando el archivo de ayuda ejecutando el código ?seq o help(). En caso de duda, es más seguro especificar argumentos por su nombre, en cuyo caso cualquier orden está bien. Puedes probar por ejemplo con los siguientes comandos:
seq(4, 8, 1)
seq(by = 1, to = 8, from = 4)
seq(to = 8, by = 1, from = 4)Contesta a la siguiente pregunta ¿Se interpretan y devuelven el mismo resultado todos estos comandos?
3. Si se está interesado en generar una secuencia entera, a menudo es más rápido usar un operador (un símbolo reservado para una tarea especial). Aquí, podríamos generar la secuencia anterior usando el operador :.
4:8Otros operadores comunes son
+,-,*,/,^, entre otros. Prueba todos ellos y explica debajo de cada línea que hace dicho operador.
4. Usa seq() y c() para crear un vector llamado a que contenga los números enteros del 1 al 10, seguido de los números enteros pares del 20 al 30, seguidos de los múltiplos de 5 del 150 al 100 (cuenta regresiva). Contesta las siguientes preguntas: ¿Cuál es la longitud del vector a? ¿Cuál es el decimocuarto elemento del vector “a”?
Aquí deberás usar primero la función seq() para generar las secuencias que necesitas y luego encadenarlas con la función c(). Además, necesitarás hacer uso de los corchetes para extraer la información del vector en las posiciones que te interese. Recuerda que el valor que se especifica dentro del corchete es la posición, o posiciones, que se desea obtener.
5. Ahora genera en una sola línea de código un vector con los valores de a en las posiciones 2º, 23º y 10º, en ese mismo orden.
6. Crea cuatro vectores diferentes. El primero llamado “nombres” con los nombres de 15 personas ficticias. El segundo llamado “país” con el país de nacimiento de esas mismas 15 personas ficticias. Asegúrate que el vector país tiene los datos de forma categórica o factor. El tercero llamado “peso” con el peso en kilogramos de cada una de esas 15 personas. Finalmente, el cuarto vector llamado “altura” deberá tener la estatura en metros de cada uno de ellos. Tened en cuenta, que los 4 vectores se ordenarán de forma correlativa: El primer peso que especifiquéis en el vector “peso” corresponderá al peso de la persona cuyo nombre aparezca en primera posición en el vector “nombres”. Una vez que hayas creado los cuatro vectores, calcula el índice de masa corporal (IMC), usando la siguiente fórmula: IMC = peso / estatura^2. Con esta información crear un vector con los nombres de las personas que hayan obtenido un IMC superior a 25.
Aquí tendrás que combinar el uso de varias funciones. Por un lado los operadores condicionales (<, <=, >, >=, ==, !=…) permiten realizar una comprobación sobre todos los valores de un vector. El resultado es un vector de valores lógicos (TRUE o FALSE) dependiendo de si cada elemento cumple la condición, o no. Posteriormente, podrás usar la función which(), que al pasarle un vector de valores lógicos, nos dice que posiciones de dicho vector son TRUE. Esto nos permite generar un índice, al que solemos llamar i, con las posiciones de los valores que nos interesan. Una vez que tengas ese índice, sólo necesitas usarlo dentro de un corchete ([]) para extraer los valores de las posiciones de interés.
7. Consulta la ayuda de la función data.frame() y explica que crees que hace la función, cuáles son los argumentos que acepta, en que orden debo especificarlos si no los nombro, y cuál es el valor por defecto de esos argumentos. Finalmente, genera un código de ejemplo donde uses la función correctamente.
Consulta la página de ayuda por completo… hasta el final.
Parte 2: Trabajando con matrices y data.frames
1. Crea una matriz llamada “A” que tenga 12 filas y 8 columnas, donde cada elemento en la matriz sea un número diferente generado aleatoriamente de una distribución normal con una media de 3 y una desviación estándar de 2. Establece una nueva variable “b” que sea igual al elemento en la quinta fila y la sexta columna de “A”.
Ten en cuenta que, una vez que se establece,
bes independiente deA. Mantendrá su valor como esté definido, incluso si los elementos deAcambian posteriormente.
Aquí necesitas usar la función matrix(). Esta función admite una serie de valores, que usará para rellenar los datos de una matriz. Además, admite los argumentos nrow y ncol especificando las dimensiones de dicha matriz. Para generar los valores aleatorios con los que rellenar la matriz puedes usar la función rnorm() a la que le puedes pasar el número de valores que necesitas generar, además de los argumentos meany sd, que permiten especificar los valores de la media y desviación estandar, respectivamente, que van a tener el conjunto de datos generado.
2. Crea un data frame llamado “datos” que contenga la información de los cuatro vectores (i.e., nombres, sexo, altura y peso) de los ejercicios anteriores. Vuelve a calcular el IMC, pero usando los datos almacenados dentro de este data frame e incorpora el resultado como una nueva columna dentro del propio data frame.
Aquí deberás usar la función data.frame(). Esta función acepta como argumentos vectores con un nombre. La forma de especificarlos es la siguiente: data.frame(nombre = vector). Puedes especificar tantos argumentos como necesites: data.frame(nombre1 = vector1, nombre2 = vector2, nombre3 = vector3). Recuerda que para extraer la información de las columnas de un data frame, puedes usar tanto corchetes ([]), como $.
Parte 3: Usando ficheros de datos
1. Lee en R un fichero de datos de ejemplo (“Abundancia.csv”) que incluye información sobre la abundancia de varias especies en diferentes sitios y llama al data frame resultante “abundancia”. Usa head(), names() y str() para explorar la estructura del data frame “abundancia”. Contesta las siguientes preguntas ¿Cuáles son los nombres de las especies muestreadas? ¿Cuantos sitios se han muestreado?
Usa la función read.csv(path), donde path indica la ubicación del archivo en el disco duro y este argumento se introduce como una cadena de texto (entre comillas). Ten en cuenta que los datos se leen en la memoria RAM del ordenador para que R trabaje con ellos. Los cambios que realices en los datos se almacenan solo en la memoria (NO alteran el archivo de datos original). Esta y otras funciones relacionadas (read.delim(), read.table() y otras) devuelven un data frame. A menudo es una buena idea usar la opción as.is = T, que impide la conversión de variables de tipo character en variables de tipo factor.
2. Usa la función apply() para calcular la abundancia promedio de cada especie.
Ten en cuenta que ahora estamos trabajando con un data frame, por lo que no todas las columnas son numéricas. La columna con el nombre de especie no puede realizar operaciones numéricas, por lo que tendrás que excluir esa columna de alguna manera. Para ello puedes usar los corchetes
[]de forma similar a como hacíamos para seleccionar elementos dentro de un vector o de una matriz.
La función apply(X, MARGIN, FUN) realiza alguna función (FUN) en cada fila o columna de una matriz o marco de datos (X). MARGIN permite especificar si se debe realizar la función en filas (MARGIN = 1) o en columnas (MARGIN = 2). FUN permite especificar la función a realizar (e.g. FUN = mean, FUN = sd o FUN = sum)
Algunas funciones útiles para usar aquí son
max,min,mean,sum, entre otras. Explora con todas ellas e intenta averiguar que hace cada una.
3. Usa la función apply() para calcular la abundancia promedio en cada sitio.
4. Usa la función which() para determinar qué sitios tienen al menos 10 individuos de Lupinus bicolor. Usa la función which() para determinar qué especies tienen una abundancia de al menos 5 en el Site5.
La función which(x) devuelve los índices de los elementos de x que son TRUE. Nota que x debe ser un vector o matriz de tipo logic (i.e. todos los valores son TRUE o FALSE).
5. Crea una nueva matriz llamada “presencia” donde cada elemento de “presencia” es 1, si el valor correspondiente de “abundancia” es mayor que 0, y 0 en el caso contrario.
La función ifelse(test, yes, no) comprueba una condición (test) y si se cumple devuelve el valor especificado en el argumento yes. Si la condición no se cumple, devuelve el valor especificado en el argumento no. Las condiciones se especifican con los operadores lógicos (v.gr. >) de la siguiente manera: vector > 25 lo que comparará cada valor del objeto vector y lo compara con 25, devolviendo TRUE o FALSE en cada caso dependiendo del resultado de la comparación. Por tanto, el resultado de la función es otro vector de la misma longitud pero de tipo lógico.
6. Usando la matriz “presencia” que creaste y la función apply(), calcula la riqueza de especies (i.e. el número de especies) de cada sitio.
7. Usando la matriz “presencia” que creaste y la función apply(), calcula la prevalencia de cada especie (i.e. el número de veces que ocurre con respecto al número total de sitios).
8. Escribe la matriz “presencia” que creaste en un archivo “Presencia.csv”.
La función write.csv(x, file) te permitirá guardar el objeto x con el nombre especificado en file. Al tratarse de un nombre de fichero se especifica entre comillas file = "fichero.csv".