Maestría en Hidrología
Universidad de Cuenca
https://www.ucuenca.edu.ec/maestria-ecohidrologia/
Johanna Orellana-Alvear (MSc, PhD candidate)
johanna.orellana@ucuenca.edu.ec
Curso completo en: http://rpubs.com/Johanna_Orellana_Alvear/programacion_r_indice_2018
En esta lección aprenderás a:
- Manejar el entorno de Rstudio
- Identificar las diferencias entre tipos de datos
- Manejar atributos de objetos
- Entender el concepto de coerción
- Manejar datos tipo factor
- Manejar data frames
A- Entorno de Rstudio
B- Tipos de Datos
C- Manejo de la ayuda
Navegaremos sobre el entorno de Rstudio para familiarizarnos con la distribución de ventanas y opciones de los menus.
La interacción final con el computador se efectúa a través de letras y números, lo que denominamos como caracterres alfanuméricos.
Los tipos atómicos de datos en R son: + Caracteres + Enteros + Reales + Complejos + Boleanos
Este es simplemente un vector de datos y se puede crear usando el comando c(). Este comando permite agrupar ciertos datos en un vector.
estaciones<-c('Toreadora','La Virgen','Chirimachay','Tres Cruces','Balzay','Sayausí')
estaciones
## [1] "Toreadora" "La Virgen" "Chirimachay" "Tres Cruces"
## [5] "Balzay" "Sayaus<U+00ED>"
length(estaciones)
## [1] 6
coordsX <-c(697618.73,701110.74,705703.88,695540.08,718267.1,714620)
coordsX
## [1] 697618.7 701110.7 705703.9 695540.1 718267.1 714620.0
length(coordsX)
## [1] 6
¿Qué sucede al intentar crear el vector estacion <- c('Toreadora',697618.73)''?
Existen seis tipos básicos de vectores: dobles, enteros, caracteres, lógicos, complejos, y crudos. Estos son algunos ejemplos de creación.
typeof(estaciones)
## [1] "character"
typeof(coordsX)
## [1] "double"
text <- c("Hello", "World") #character
comp<-c(1+1i,1+2i,1+3i)
raw(3)
## [1] 00 00 00
3>4 # FALSE
## [1] FALSE
logic <- c(TRUE, FALSE, TRUE)
a <- c(-1L, 2L, 4L)
b <- c(-1, 2, 4)
¿Cuál es la diferencia entre las variables a y b, por qué?
Varios objetos R tienen atributos, estos representan información extra o metadata del objeto. Los atributos pueden ser identificados por un nombre (e.g names) y estáán asociados a un objeto R. Estos atributos no afectan los valores del objeto como tal sino que añaden información del objeto R para facilitar su manipulación. Por ejemplo es común que el objeto de tipo data.frame tenga asociado los nombres de sus filas y columnas. A continuación vamos a asignar nombres al vector coordsX.
names(coordsX) ## NULL
## NULL
names(coordsX) <- c("E1", "E2", "E3", "E4", "E5", "E6")
names(coordsX)
## [1] "E1" "E2" "E3" "E4" "E5" "E6"
attributes(coordsX)
## $names
## [1] "E1" "E2" "E3" "E4" "E5" "E6"
coordsX + 1
## E1 E2 E3 E4 E5 E6
## 697619.7 701111.7 705704.9 695541.1 718268.1 714621.0
Anteriormente modificamos los nombres (names) del vector de coordenadas. Así también otro atributo es la dimensión (dim). Se puede transformar el vector en arreglo –matriz– de n dimensiones.
dim(coordsX) <- c(2, 3)
coordsX
## [,1] [,2] [,3]
## [1,] 697618.7 705703.9 718267.1
## [2,] 701110.7 695540.1 714620.0
dim(coordsX) <- c(3, 2)
coordsX
## [,1] [,2]
## [1,] 697618.7 695540.1
## [2,] 701110.7 718267.1
## [3,] 705703.9 714620.0
dim(coordsX) <- c(1, 2, 3)
coordsX
## , , 1
##
## [,1] [,2]
## [1,] 697618.7 701110.7
##
## , , 2
##
## [,1] [,2]
## [1,] 705703.9 695540.1
##
## , , 3
##
## [,1] [,2]
## [1,] 718267.1 714620
Sobre los valores lógicos TRUE y FALSE, estos se interpretan también como valores enteros 1 y 0. Por lo tanto es posible contabilizar el número de elementos verdaderos en un vector con una sentencia simple… a este proceso se le denomina coerción.
sum(c(TRUE, TRUE, FALSE, FALSE))
## [1] 2
Las matrices almacenan información en múltiples dimensiones. Ahora crearemos una matriz a partir del vector estaciones que contiene nombres de estaciones
m <- matrix(estaciones, nrow = 2)
m
## [,1] [,2] [,3]
## [1,] "Toreadora" "Chirimachay" "Balzay"
## [2,] "La Virgen" "Tres Cruces" "Sayaus<U+00ED>"
m <- matrix(estaciones, nrow = 2, byrow = TRUE)
m
## [,1] [,2] [,3]
## [1,] "Toreadora" "La Virgen" "Chirimachay"
## [2,] "Tres Cruces" "Balzay" "Sayaus<U+00ED>"
Es posible aplicar ciertas operaciones y funciones a una variable según su tipo. Para ello lo primero es identificar la clase de la variable.
class(m)
## [1] "matrix"
class(text)
## [1] "character"
Las fechas y horas pueden visualmente ser creadas como texto fecha='2015-10-12 21:29:45', sin embargo no es posible aplicar operaciones (e.g calcular diferencia entre dos fechas) o extraer información como el mes o el año. Una variable que almacena fecha en su formato propio se expresa así:
now <- Sys.time()
now
## [1] "2018-05-07 17:55:25 ECT"
class(now)
## [1] "POSIXct" "POSIXt"
POSIXct es un framework para representar fecha y horas. En este framework cada fecha es representada por el número de segundos que han transcurrido desde 12:00 AM Enero 1ro. de 1970 (en el Universal Time Coordinated (UTC) zone) hasta la fecha definida.
Este tipo de datos se utiliza frecuentemente para denotar algún tipo de clasificación o disgregación. Tienen asociada una descripción a un valor numérico. Esto permite reducir el espacio en disco para el almacenamiento.
gender <- factor(c("male", "female", "female", "male"))
typeof(gender)
## [1] "integer"
attributes(gender)
## $levels
## [1] "female" "male"
##
## $class
## [1] "factor"
Para visualizar como R almacena la información de la variable tipo factor se usa el comando unclass().
unclass(gender)
## [1] 2 1 1 2
## attr(,"levels")
## [1] "female" "male"
gender
## [1] male female female male
## Levels: female male
as.character(gender)
## [1] "male" "female" "female" "male"
Similares a los vectores por cuanto agrupan datos en un conjunto unidimensional, sin embargo las listas no agrupan valores individuales sino objetos R. Cada uno de los elementos de la lista puede a su vez contener varios valores individuales. Para crear este tipo de objeto se usa la función list() separando cada elmento con una coma.
list1 <- list(100:130, "R", list(TRUE, FALSE))
list1
## [[1]]
## [1] 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
## [18] 117 118 119 120 121 122 123 124 125 126 127 128 129 130
##
## [[2]]
## [1] "R"
##
## [[3]]
## [[3]][[1]]
## [1] TRUE
##
## [[3]][[2]]
## [1] FALSE
El tipo de objeto data frame es una versión de dos dimensiones de una lista. Esta estructura es la más utilizada para el almacenamiento de datos. Esta estructura es equivalente a una hoja de cálculo en excel. Los data frames agrupan vectores, donde cada uno de ellos representa una columna del data frame, así pues cada columna puede ser de un tipo diferente.
df <- data.frame(descripcion = c("Toreadora", "Chirimachay", "La Virgen"),
cuenca = c("Quinoas", "Quinoas", "Quinoas"), id= c(1, 2, 3))
df
## descripcion cuenca id
## 1 Toreadora Quinoas 1
## 2 Chirimachay Quinoas 2
## 3 La Virgen Quinoas 3
typeof(df)
## [1] "list"
class(df)
## [1] "data.frame"
str(df)
## 'data.frame': 3 obs. of 3 variables:
## $ descripcion: Factor w/ 3 levels "Chirimachay",..: 3 1 2
## $ cuenca : Factor w/ 1 level "Quinoas": 1 1 1
## $ id : num 1 2 3
El tipo factor es uno de los “preferidos” de R, por lo tanto, cualquier dato que corresponda inicialmente a texto podría ser interpretado por R como un factor. Sin embargo, esto no siempre es lo que se desea y para evitar la creación (conversión) a este tipo en las columnas del data frame podemos usar el argumento stringsAsFactors = FALSE
df <- data.frame(descripcion = c("Toreadora", "Chirimachay", "La Virgen"),
cuenca = c("Quinoas", "Quinoas", "Quinoas"), id= c(1, 2, 3), stringsAsFactors = FALSE)
df
## descripcion cuenca id
## 1 Toreadora Quinoas 1
## 2 Chirimachay Quinoas 2
## 3 La Virgen Quinoas 3
str(df)
## 'data.frame': 3 obs. of 3 variables:
## $ descripcion: chr "Toreadora" "Chirimachay" "La Virgen"
## $ cuenca : chr "Quinoas" "Quinoas" "Quinoas"
## $ id : num 1 2 3
¿Cómo acceder a las columnas de mi data frame?
df$descripcion
## [1] "Toreadora" "Chirimachay" "La Virgen"
df$id
## [1] 1 2 3
desc <- df$descripcion
desc
## [1] "Toreadora" "Chirimachay" "La Virgen"
class(desc)
## [1] "character"
typeof(desc)
## [1] "character"
Crear un data frame manualmente puede ser muy extenso y además ser sensible a errores de escritura. La mayor parte de aplicaciones trabajan con archivos de texto que pueden ser importados o exportados.
df.data <- iris
nrow(df.data)
## [1] 150
head(df.data)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
tail(df.data)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 145 6.7 3.3 5.7 2.5 virginica
## 146 6.7 3.0 5.2 2.3 virginica
## 147 6.3 2.5 5.0 1.9 virginica
## 148 6.5 3.0 5.2 2.0 virginica
## 149 6.2 3.4 5.4 2.3 virginica
## 150 5.9 3.0 5.1 1.8 virginica
names(df.data)
## [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
## [5] "Species"
Ahora vamos a extraer una sola columna del data frame y contabilizar el número de elementos.
longitudP <- df.data$Petal.Length
nrow(longitudP)
## NULL
length(longitudP)
## [1] 150
¿Por qué no es posible utilizar el comando nrow()?