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

Temario

A- Entorno de Rstudio
B- Tipos de Datos
C- Manejo de la ayuda

Antes de Empezar

  • ¿Qué es un algoritmo?
  • ¿Qué es un lenguaje de programación?
  • ¿Qué es una variable?
  • ¿Qué es un programa o script?

A- Entorno de Rstudio

Navegaremos sobre el entorno de Rstudio para familiarizarnos con la distribución de ventanas y opciones de los menus.

B- Tipos de Datos

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

Atomic Vectors

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

Atributos

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
Coerción

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

Matrices

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"

Fechas y Horas

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.

Factores

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"

Listas

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

Data Frames

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

C- Manejo de la ayuda

Utilizaremos la pestaña de ‘Help’ (ayuda) de Rstudio para identificar como utilizar comandos/funciones que no son familiares o para obtener más detalles de un método específico.