a <- 24
class(a)
## [1] "numeric"2 Tipos, objetos y estructuras de datos
Todos los objetos que guardamos en el environment tienen una clase. Existen muchísimos tipos de clases en R (incluso se pueden crear clases nuevas). Para conocer la clase de un objeto usamos la función class().
A veces hace falta conocer cuál es la clase de nuestro objeto. Es posible que aparezcan errores si queremos utilizar una clase de un objeto con una función que no reconoce esa clase (mira el ejemplo inferior). Si no se transforma la clase del objeto a la clase que requiere la función como parámetro, ésta no funcionará. No obstante nos devolverá un error o un warning que nos dará pistas sobre lo que debemos hacer.
Por ejemplo, podemos hacer la media de los números 1, 2 y 3, pero no podemos hacer la media de las letras “a”, “b” y “c”.
mean(c(1, 2, 3))
## [1] 2mean(c("a", "b", "c")) # produce un warning
## Warning in mean.default(c("a", "b", "c")): argument is not numeric or logical:
## returning NA
## [1] NA
objeto_inexistente # produce un error
## Error:
## ! objeto 'objeto_inexistente' no encontrado2.1.Vectores
La clase más importante en R es el vector atómico.
Un vector es un conjunto de uno o más elementos de un mismo tipo y se crean con la función c() (abreviación de combine). Los tipos atómicos más habituales son:
integer: números enteros,
double: números decimales,character(o string): cadenas de texto (palabras o números). Van siempre rodeadas de comillas simples (‘hola’) o dobles (“hola”).
logical: utilizado para valores binarios,TRUEoFALSE. También reconoceToF, aunque se desaconseja esta práctica.
numeric_vector <- c(1,2,3,4,5)
character_vector <- c("Fagus sylvatica", "Quercus suber",
"Prunus spinosa", "Sorbus aucuparia")
logical_vector <- c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE)
mix_vector <- c(4, "Sus scrofa", 10, "Cervus elaphus")Había dicho que el vector sólo permite crear objetos de una misma clase. Entonces, ¿qué ha pasado con mix_vector? Espero que te pique la curiosidad y te invito a que compruebes la clase que es para que comprendas qué ha ocurrido. Pista: tiene que ver con algo llamado coerción.
Existen otras formas de crear vectores atómicos. Una de las más frecuentes es usando dos puntos : para crear una secuencia de números de 1 en 1, o utilizar seq() para crear una secuencia de números diferente:
1:10
## [1] 1 2 3 4 5 6 7 8 9 10
seq(1, 10, by = 2)
## [1] 1 3 5 7 9Para acceder a los elementos de un vector usamos el número de orden del elemento entre corchetes (empezando por 1):
plantas<-character_vector
plantas[1]
## [1] "Fagus sylvatica"
plantas[1:3]
## [1] "Fagus sylvatica" "Quercus suber" "Prunus spinosa"
plantas[c(1,3)]
## [1] "Fagus sylvatica" "Prunus spinosa"2.2.Listas
Una lista puede contener elementos de distinto tipo. Se crean con la función list():
list(45, "jamón", T, 1i, c(1,2,3))
## [[1]]
## [1] 45
##
## [[2]]
## [1] "jamón"
##
## [[3]]
## [1] TRUE
##
## [[4]]
## [1] 0+1i
##
## [[5]]
## [1] 1 2 3Y aunque quizás te pueda sonar un poco raro, una lista puede contener otras listas:
list(45, "jamón", list("esta es otra lista", 27.31))
## [[1]]
## [1] 45
##
## [[2]]
## [1] "jamón"
##
## [[3]]
## [[3]][[1]]
## [1] "esta es otra lista"
##
## [[3]][[2]]
## [1] 27.31Los elementos de una lista pueden tener nombre propio:
plantas <- list("especie" = c("Fagus sylvatica", "Quercus suber"),
"familia" = "Fagaceae")Se puede acceder a los elementos de una lista de varias maneras:
plantas[1]
## $especie
## [1] "Fagus sylvatica" "Quercus suber"
plantas$especie
## [1] "Fagus sylvatica" "Quercus suber"Te invito a que pruebes a ver qué pasa tratando de acceder de distintas maneras a la lista. Por ejemplo, ¿qué te da plantas[1], plantas[[1]], plantas[[1]][[1]] y plantas[[1]][3]? ¿Entiendes los distintos resultados?
2.3. Matrices
Otra clase importante de R son las matrices. Una matriz organiza valores del mismo tipo en dos dimensiones: filas y columnas. Se puede crear utilizando la función matrix().
En R, una matriz se almacena internamente como un vector al que se le añaden dimensiones. Por eso, todos sus elementos deben ser del mismo tipo, a diferencia de un data.frame que veremos a continuación.
mi_matriz <- matrix(1:9, ncol = 3, byrow = TRUE)Para acceder a los elementos de la matriz podemos utilizar sus filas, columnas, o ambos.
mi_matriz[3,2]
## [1] 8
mi_matriz[1,]
## [1] 1 2 3
mi_matriz[2:3,2:3]
## [,1] [,2]
## [1,] 5 6
## [2,] 8 92.4. Data frames y tibbles
Un data frame es una tabla organizada en filas y columnas. A diferencia de una matriz, sus columnas pueden almacenar distintos tipos de datos, es decir, en las tablas podemos tener una columna que sea numérica, una columna que sea texto y otra lógica. Cada columna se forma a través de vectores.
Todas las columnas que contiene una tabla deben tener la misma longitud.
Al igual que las listas, los elementos de la tabla pueden ser llamados por su posición o por su nombre.
df <- data.frame("letras" = c("a", "b", "c", "d"), "numeros" = 4:7)
df
## letras numeros
## 1 a 4
## 2 b 5
## 3 c 6
## 4 d 7
df[3, ]
## letras numeros
## 3 c 6
df[, 2]
## [1] 4 5 6 7
df$letras
## [1] "a" "b" "c" "d"
df$letras[2]
## [1] "b"
df[2, 1]
## [1] "b"Un tibble es una versión moderna y optimizada del data frame, creada dentro del ecosistema tidyverse para corregir comportamientos antiguos y frustrantes de R básico. A los efectos es lo mismo: una tabla estructurada, ¡pero con funcionalidades muy interesantes y útiles para el manejo de datos!
2.5. Factores (variables categóricas)
Los factores se utilizan para representar variables categóricas (e.g. sexo, tratamiento, especie, país).
Internamente, R almacena cada observación mediante un código entero asociado a un conjunto de categorías. Las categorías posibles se denominan niveles (levels).
Al crear un factor:
- levels: indica qué valores originales reconoce R como categorías y en qué orden.
- labels: permite definir nombres a esas categorías. No siempre tenemos por qué definir las etiquetas, pero a veces puede sernos útil para realizar tablas, gráficos y modelos estadísticos.
Si no se especifican los niveles, R suele ordenarlos alfabéticamente.
tratamiento <- factor(c("control", "riego", "control", "riego"),
labels = c("Control", "Riego"))
tratamiento
## [1] Control Riego Control Riego
## Levels: Control Riego
levels(tratamiento)
## [1] "Control" "Riego"
as.integer(tratamiento)
## [1] 1 2 1 2El vector contiene cuatro observaciones, pero solamente dos niveles:
ControlyRiego. Los números obtenidos conas.integer()son los códigos internos que asigna R, no los valores originales.
2.6. Diferencia entre NULL y NA
1. Clases de objetos básicas
1A)
- Intenta adivinar la clase de los siguientes objetos. Luego, usa la función class para comprobarlo: 23,"42.5",42.5,"salchipapa", 3L, T, "T", 1i, list, list(), NULL
El comando c(2, “a”), ¿dará algún error? ¿Por qué? Compruébalo; si el resultado no es el esperado, intenta comprender por qué.
Crea un vector
aque sea 6 y un vectorbque sea 24. Divide b/a. ¿Qué obtienes?
1B) Crea el siguiente vector y guárdalo con el nombre que quieras: (45, 12,-6, 7, 64, 32, 86, 2, 1, 98, 53, 10, -56, -42, 121, 0, 5.3). A partir de él obtén:
su máximo valor, su media, su mediana, su mínimo valor.
Ordena el primer vector de mayor a menor.
Selecciona los elementos del vector que sean mayores a 27.
Y los que sean menores a 2.
Selecciona los elementos que cumplan al menos una de las dos condiciones anteriores.
Crea una secuencia de números, de 2 a 4, introduciendo un nuevo número cada 0.05. ¿Cuántos números posee el nuevo vector?
Crea un vector del 1 al 65 y obtén la mediana.
1C) Crea una lista con una lista interna de los 4 primeros números pares y otra lista interna de los 4 primeros números impares. Nombra - “par” e “impar”- las listas contenidas en la lista principal.
2. Clases compuestas: matrix, data frame, factor
2A) Crea un vector de números secuenciales entre 19 y 78.5 en intervalos de 3.5 y guárdalo con un nombre que te parezca apropiado.
- ¿Cuál es el decimoctavo elemento del vector? ¿Y los elementos del 3 al 15?
- ¿Cuál es su longitud? >Pista: usa la función length.
2B) Usa el vector que has guardado para crear una matriz y guárdala con otro nombre. Usa ncol para determinar el número de columnas que tendrá tu matriz. Saca los elementos comprendidos entre la primera y cuarta fila y la segunda columna.
Usa de nuevo la función length para determinar el tamaño de la matriz, ¿sale lo que esperabas? Prueba usando dim, ¿qué relación hay entre ambas?
En R, las matrices son sólo “vectores plegados”.
2C) Crea un dataframe que relacione los siguientes nombres con su edad: Elisa- 15 años; Eva- 24 años; Quique- 51 años; Lola- 71 años; Nati- 22 años; Paul- 46 años.
- ¿Cuántos años tiene la 5ª persona de la lista y cómo se llama? Nombra a este vector “Quinta”.
- Ordena de mayor a menor las edades de estas personas yllama a este vector “Edades”.
- Obtén un vector sólo con los nombres de estas personas, nómbralo “NOMBRES”. Cambia todas las letras del vector por letras mayúsculas.
3. Funciones base
3A) Usa la función rep para crear un vector que repita los valores 0 y 1 alternados 20 veces. ¿Y si quieres que aparezcan primero 20 unos y luego 20 ceros? >Pista: Usa ?rep para ver las opciones disponibles que le puedes pasar a la función.
3B) Abre la página de ayuda de la función ls para comprender para qué sirve. A continuación, úsala. >Nota: ls no toma ningún argumento; tendrás que escribir ls()
3C) Haz lo mismo con la función rm. A continuación, úsala sobre un objeto de tu entorno de trabajo. ¿Hay alguna manera de borrar todas las variables a la vez? >Pista: Google es tu amigo aquí
3D) Un ejemplo guiado sample con números, otro en los ejercicios libres con caracteres.
3E) Crea un vector de 100 números “1”.
3F) Crea un vector de 11 números del 0 al 10. Determina sobre este último vector, otro que asigne “par” o “impar” a sus números.
3G) Vector aleatorio:
- Crea un vector de 47 números con una distribución normal y llámalo “alturas”.
La función
rnormcrea un vector de números con la media y sd indicada en los argumentos. Utiliza ?rnorm si necesitas ayuda.
- Ahora haz:
hist(alturas). ¿Qué has obtenido? - Ahora utiliza la función
plot. ¿Qué diferencia hay en los ejes respecto a hist? - Crea otro vector de la misma longitud y llámalo “pesos”. Ahora haz
plot(alturas, pesos). ¿Qué representa el gráfico?