Este cuaderno es una guía para facilitar el desarrollo de la actividades en clase de los cursos: Hidroclimatológia (pregrado y posgrado) y Modelación de procesos hidrológicos de la FEAR-PUJ, y fue consolidado con la ayuda de Carlos Andres Olarte García y Gian Piero Fernando Ciro Fava Caceres (estudiantes de Maestría en Energía y Sostenibilidad de la PUJ).

1 Tipos de datos en R

1.1 Numéricos

El tipo de dato numérico en R esta compuesto por tipos de datos: double (reales) y enteros (numeric) . Se puede comprobar si un objeto es numérico con la función mode o si la función is.numeric devuelve como resultado la palabra TRUE.

  • ¿Qué es un dato double?

Los datos double en R son la representación de un objeto numérico de doble precisión. Tenga en cuenta que, de forma predeterminada, todos los números son double en R y que nf, -Inf, NaN, la notación científica y la notación hexadecimal de números también son doubles.

mode(55) #numeric
## [1] "numeric"
is.numeric(3) #TRUE
## [1] TRUE

Adicionalmente, se pueden usar otras funciones para identificar la variable como numérica, por ejemplo con la función class

prueba <- 34.80
class(prueba) #numeric
## [1] "numeric"

1.2 Enteros

El tipo de dato entero se puede crear agregando una L a un número. Este tipo de datos es útil si se quiere pasar algún objeto de R a una función de C++ o FORTRAN que espera un valor entero, por lo que este tipo de datos generalmente no es necesario. Se puede verificar el tipo de datos con la función is.integer.

y <- 2L
typeof(y) # "integer"
## [1] "integer"
is.integer(3) # FALSE
## [1] FALSE
is.integer(3L) # TRUE
## [1] TRUE
is.integer(y) # TRUE
## [1] TRUE

1.3 Caracteres (texto)

Los caracteres o las cadenas de caracteres son: símbolos, letras, palabras o frases dentro de comillas dobles o simples. Se puede verificar que algún objeto es de tipo carácter con la función is.character.

letra <- "a"
typeof(letra) # "character"
## [1] "character"
is.character(letra) # TRUE
## [1] TRUE

1.4 Lógicas

El tipo logical es la forma que tiene R para caracterizar los datos binarios. Estos datos son normalmente usados en test lógicos y son conocidos como datos booleanos o lógicos y están compuestos por los valores TRUE, FALSE y NA. Nótese que se puede usar T (TRUE) y F (FALSE) como simplificación de las palabras extensas. Sin embargo, esto no se recomienda porque se podría sobrescribir el valor de T o F pero no el de TRUE o FALSE, como se muestra en el siguiente bloque de código.

F # FALSE
## [1] FALSE
a <- T

# Puedes nombrar una variable como T o F
F <- a
F # TRUE
## [1] TRUE
# No puedes nombrar una variable como TRUE o FALSE
a <- TRUE

Otro ejemplo

a <- 2
b <- 4
a == b  # ¿es igual a y b?
## [1] FALSE
## [1] FALSE

1.5 Factores

Una variable factor es una variable categórica. Los vectores de caracteres a menudo se almacenan como factores para explorar funciones. Por ejemplo, esto es usado en análisis de regresión.

vector_mes_malo <- factor(c("enero", "febrero", "marzo", "abril", "enero"))
class(vector_mes_malo)
## [1] "factor"

1.6 Complejo

El tipo de dato complejo es un objeto que incluye un numero imaginario (i), el tipo de dato imaginario tiene una parte real y una parte imaginaria (parte que incluye la (i)). Como los números imaginarios generalmente no se usan en estadística, este tipo de datos no es muy común en las aplicaciones de los cursos aquí referenciados. La función para verificar este tipo de datos es is.complex.

1 + 3i 
## [1] 1+3i
typeof(1 + 3i) # "complex"
## [1] "complex"
is.complex(1 + 3i)
## [1] TRUE

1.7 Date

Este tipo de datos es el de mayor utilidad en hidrclimatología, pues permite organizar la información de acuerdo a la variable temporal (fechas) reprotada por cada variabe hidroclimatológica. Almacena sus valores internamente como el número de días transcurridos desde el 1 de enero de 1970; para las fechas anteriores el número de días se cuenta en sentido negativo.

R dispone en su paquete base de dos clases específicamente diseñadas para tratar con datos de tipo fecha/hora: Date (solo para fechas) y POSIXt (además de la fecha incluye hora y huso horario); esta última clase contiene dos subclases, POSIXct y POSIXlt que se diferencian simplemente en la forma en que almacenan internamente la fecha y la hora.

Por ejemplo, si se introduce la fecha en otro formato (por ejemplo “dd/mm/yyyy”), hemos de indicarlo al usar as.Date para que R pueda interpretar la fecha correctamente

navidad=as.Date("25/12/2013",format="%d/%m/%Y")   #[1] "2013-12-25"
navidad                                          
## [1] "2013-12-25"

2 ¿Cómo Se Organizan Los Tipos de Datos?

2.1 Vectores

Los vectores se caracterizan por tener una dirección y una magnitud y sus componentes se guardan en coordenadas. Así como una variable puede almacenar un objeto, un vector puede almacenar varios objetos en un orden determinado. Los vectores pueden representar la columna de una tabla de datos, y no pueden confundirse entre números con caracteres. Deben ser construidos con el mismo tipo de dato.

Los vectores se crean con la función c (la c es de combinar) y pueden ser de tipo numérico (1234), carácter (abcd) o lógico (true or false).

En este ejercicio vamos a: 1. Crear vectores en un script 2. Realizar opraciones aritméticas con vectores 3. Seleccionar elementos en un vector

Práctica 1: Creando vectores en R

crear vector carácter con nombre de parámetros físicos

temperatura <- c("Bogotá", "Pereira", "Medellín","Cartagena")
temperatura
## [1] "Bogotá"    "Pereira"   "Medellín"  "Cartagena"

crear vector numérico con valores de los parámetros del vector nombre

temperatura_valor <- c(13, 25, 30, 33)
temperatura_valor
## [1] 13 25 30 33

crear vector lógico sobre los datos, si están por encima (VERDADERO) o debajo (FALSO) del promedio de las ciudades del vector temperatura (14, 26, 27, 31).

comparacion<- c(FALSE, FALSE, TRUE, TRUE)
comparacion
## [1] FALSE FALSE  TRUE  TRUE

Práctica 2: Operaciones aritméticas con vectores

sumar 2 al vector temperatura

temperatura_valor+2
## [1] 15 27 32 35

Dividir al vector temperatura

temperatura_valor/2
## [1]  6.5 12.5 15.0 16.5

crear un vector con otros valores

temperatura_valor2 <- c(25, 30, 27, 33)

calcular diferencia entre los vectores de temperatura

temperatura_valor - temperatura_valor2
## [1] -12  -5   3   0

calcular la longitud del vector de temperatura

length(temperatura)
## [1] 4

calcular el promedio del vector de temperatura_valor

mean(temperatura_valor)
## [1] 25.25

práctica 3: selección de elementos de un vector

  • Selección basada en posición:

seleccionar la tercera posición del vector temperatura para saber a que ciudad pertenece

temperatura[3]
## [1] "Medellín"

seleccionar la primera y la última ciudad

temperatura[c(1,4)]
## [1] "Bogotá"    "Cartagena"
  • Selección basada en condición lógica:

Crear condición lógica

temperatura_valorbajo <- temperatura_valor < 29
temperatura_valorbajo #permite observar los resultados: TRUE/FALSE
## [1]  TRUE  TRUE FALSE FALSE

Mostrar temperaturas bajas

temperatura_valor[temperatura_valorbajo]
## [1] 13 25

Mostrar nombres de ciudades con puntuaciones bajas

temperatura[temperatura_valorbajo]
## [1] "Bogotá"  "Pereira"

2.2 Matrices

Una matriz de dos columnas y un gráfico de dispersión son practicamente lo mismo. ya que son de coordenadas x,y una matriz es una forma de acomodar los datos que tienen filas y columnas las matrices pueden almacenar tipos de archivo numeros, caracter o lógicos, pero no combinados se pueden construir combinando varios vectores.

para matrices se tiene en cuenta c como el número, nrow como el número de filas y ncol como elnúmero de columnas. El comando byrow organiza la información por filas, y T es de verdadero (TRUE) y sin T, se asume como predeterminado el FALSE.

A<- matrix(c(1:9),nrow = 3,ncol = 3)
A
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
B<- matrix(c(10:18),nrow = 3,ncol = 3,byrow = T)
B
##      [,1] [,2] [,3]
## [1,]   10   11   12
## [2,]   13   14   15
## [3,]   16   17   18
C<- matrix(c(1,5,7,4,5,6,8,4,6),nrow = 3,ncol = 3,byrow = T)
C
##      [,1] [,2] [,3]
## [1,]    1    5    7
## [2,]    4    5    6
## [3,]    8    4    6
D<- matrix(c(1,5,7),nrow = 3,ncol = 1)
D
##      [,1]
## [1,]    1
## [2,]    5
## [3,]    7
  • Operación de Matrices: para la operación de matrices deben de tener las mismas dimensiones. i.e.

Suma

A+B
##      [,1] [,2] [,3]
## [1,]   11   15   19
## [2,]   15   19   23
## [3,]   19   23   27

Resta

A-B
##      [,1] [,2] [,3]
## [1,]   -9   -7   -5
## [2,]  -11   -9   -7
## [3,]  -13  -11   -9

Multiplicación por constante

A*3
##      [,1] [,2] [,3]
## [1,]    3   12   21
## [2,]    6   15   24
## [3,]    9   18   27

Multiplicación de matrices

A*B
##      [,1] [,2] [,3]
## [1,]   10   44   84
## [2,]   26   70  120
## [3,]   48  102  162

si se quiere una multiplicación matricial se debe tener el símbolo %.

A%*%B
##      [,1] [,2] [,3]
## [1,]  174  186  198
## [2,]  213  228  243
## [3,]  252  270  288

Diagonal

diag(A)
## [1] 1 5 9

Inversa. La inversa se puede calcular siempre y cuando la determinante sea diferente de cero (0).

solve(C)
##            [,1]        [,2]       [,3]
## [1,] -0.1428571  0.04761905  0.1190476
## [2,] -0.5714286  1.19047619 -0.5238095
## [3,]  0.5714286 -0.85714286  0.3571429

Traspuesta

t(A)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9

solución de sistema de matrices

solve(C,D)
##            [,1]
## [1,]  0.9285714
## [2,]  1.7142857
## [3,] -1.2142857

2.3 Data Frame (la diferencia entre matrices y data frame es que las matrices solo se refieren a valores numéricos)

en un data frame se pueden poner caracteres tipo lógico, numéricos y enteros, entre otros los data frame guardan diferentes tipos de datos en columnas.

Inicialmente, se deben crear los vectores con la información que se desea guardar

Temperatura <- c(25, 27, 29, 25, 27, 33, 31, 27, 26, 30, 32, 33)
Precipitación <- c(55, 47, 50, 56, 54, 25, 27, 50, 50, 27, 26, 25)
fecha<- c("1978-01-01","1979-02-12","1980-02-15", "1981-01-29","1982-01-25", "1983-01-02",
          "1984-02-07", "1985-04-07","1986-01-25","1987-03-06","1988-03-25","1989-02-07")

Posteriormente, se guardan los datos dentro de una variable, que para este caso se llamó tabla, y mediante el comando view, se observan los valores categorizados

tabla <- data.frame(fecha,Temperatura,Precipitación)
tabla
#View(tabla) #permite visualizar la información de la variable en la consola

Posteriormente, es posible determinar la observación de un grupo de datos dentro de la tabla generada, de los 12 datos que contienen los vectores, (fecha, temperatura y precipitación), es posible seleccionar los datos, por ejemplo, desde el 3 al 7.

subtabla = tabla[3:7,]
subtabla
View(subtabla)

Así mismo, si se quiere identificar las fechas en que la temperatura fue la misma, mayor o menor, se puede realizar un filtro. Por ejemplo, generar una tabla con las fechas en la que la temperatura fue mayor a 27 °C)

tabla3=tabla[tabla$Temperatura==27,]
tabla3
View(tabla3)

2.4 Listas

las listas guardan diferentes objetos en una misma estructura de datos en R y permiten agrupar o contener dataframes, matrices y vectores.

En este ejercicio vamos a:

  1. Crear listas en R,
  2. Seleccionar elementos de una lista,
  3. Identificar listas en R
  • Iniciamos creando las variables y los datos asociados a ellas.
Temperatura <- c(25, 27, 29, 25, 27, 33, 31, 27, 26, 30, 32, 33)
Precipitacion <- c(55, 47, 50, 56, 54, 25, 27, 50, 50, 27, 26, 25)
fecha<- c("1978-01-01","1979-02-12","1980-02-15", "1981-01-29","1982-01-25", "1983-01-02",
          "1984-02-07", "1985-04-07","1986-01-25","1987-03-06","1988-03-25","1989-02-07")
  • Ahora creamos otras varibales con información diferente.
rio <- c("Magdalena", "Suaza", "Paez", "Neiva", "Yaguara", "Saldaña", "Bogotá", "Sumapaz", "Totaré")
caudalmedio <- c(7000, 44, 181, 16, 14, 310, 39, 43, 7)
rendimientoprom <- c(26.42, 27.76, 115.65, 13.34, 9.27, 33.55, 6.51, 13.69, 4.59)
  • Creación de diferentes estructuras de datos en R: Matriz de datos y Vector de fechas
matriz_afluentes <- matrix(c(rio, caudalmedio, rendimientoprom),
                           nrow = 9,
                           ncol = 3)
matriz_afluentes
##       [,1]        [,2]   [,3]    
##  [1,] "Magdalena" "7000" "26.42" 
##  [2,] "Suaza"     "44"   "27.76" 
##  [3,] "Paez"      "181"  "115.65"
##  [4,] "Neiva"     "16"   "13.34" 
##  [5,] "Yaguara"   "14"   "9.27"  
##  [6,] "Saldaña"   "310"  "33.55" 
##  [7,] "Bogotá"    "39"   "6.51"  
##  [8,] "Sumapaz"   "43"   "13.69" 
##  [9,] "Totaré"    "7"    "4.59"
vector_fecha <- fecha
  • Práctica 1: crear una lista en R
lista_ejemp <- list(vector_fecha,
                    matriz_afluentes) 
  • Mostrar lista
lista_ejemp
## [[1]]
##  [1] "1978-01-01" "1979-02-12" "1980-02-15" "1981-01-29" "1982-01-25"
##  [6] "1983-01-02" "1984-02-07" "1985-04-07" "1986-01-25" "1987-03-06"
## [11] "1988-03-25" "1989-02-07"
## 
## [[2]]
##       [,1]        [,2]   [,3]    
##  [1,] "Magdalena" "7000" "26.42" 
##  [2,] "Suaza"     "44"   "27.76" 
##  [3,] "Paez"      "181"  "115.65"
##  [4,] "Neiva"     "16"   "13.34" 
##  [5,] "Yaguara"   "14"   "9.27"  
##  [6,] "Saldaña"   "310"  "33.55" 
##  [7,] "Bogotá"    "39"   "6.51"  
##  [8,] "Sumapaz"   "43"   "13.69" 
##  [9,] "Totaré"    "7"    "4.59"
  • Cambiar nombre del Data Frame
names(lista_ejemp) <- c('vector','matriz')
  • Mostrar lista
lista_ejemp
## $vector
##  [1] "1978-01-01" "1979-02-12" "1980-02-15" "1981-01-29" "1982-01-25"
##  [6] "1983-01-02" "1984-02-07" "1985-04-07" "1986-01-25" "1987-03-06"
## [11] "1988-03-25" "1989-02-07"
## 
## $matriz
##       [,1]        [,2]   [,3]    
##  [1,] "Magdalena" "7000" "26.42" 
##  [2,] "Suaza"     "44"   "27.76" 
##  [3,] "Paez"      "181"  "115.65"
##  [4,] "Neiva"     "16"   "13.34" 
##  [5,] "Yaguara"   "14"   "9.27"  
##  [6,] "Saldaña"   "310"  "33.55" 
##  [7,] "Bogotá"    "39"   "6.51"  
##  [8,] "Sumapaz"   "43"   "13.69" 
##  [9,] "Totaré"    "7"    "4.59"
  • Práctica 2: Seleccionar elementos de una lista

En general para seleccionar elementos se utilizan un par de corchetes, pero con las listas es un poco diferente ya que se utilizan dobles corchetes, esto puede ser util para diferenciar un data frame con una matriz. Una vez se tiene seleccionado el elemento de la lista se utilizan las formas de seleccion que se han visto para otros objetos

Seleccionar vector de la lista

lista_ejemp[['vector']]
##  [1] "1978-01-01" "1979-02-12" "1980-02-15" "1981-01-29" "1982-01-25"
##  [6] "1983-01-02" "1984-02-07" "1985-04-07" "1986-01-25" "1987-03-06"
## [11] "1988-03-25" "1989-02-07"

Seleccionar el tercer elemento del vector de la lista

lista_ejemp[['vector']][3]
## [1] "1980-02-15"

Seleccionar fila 5 y columna 3 de la matriz de la lista

lista_ejemp[['matriz']][5,3]
## [1] "9.27"
  • Práctica 3: agregar/eliminar elementos a una lista

Agregar dataframe a lista

lista_ejemp[['data_frame']] <- vector_fecha

Revisar que está el dataframe

lista_ejemp
## $vector
##  [1] "1978-01-01" "1979-02-12" "1980-02-15" "1981-01-29" "1982-01-25"
##  [6] "1983-01-02" "1984-02-07" "1985-04-07" "1986-01-25" "1987-03-06"
## [11] "1988-03-25" "1989-02-07"
## 
## $matriz
##       [,1]        [,2]   [,3]    
##  [1,] "Magdalena" "7000" "26.42" 
##  [2,] "Suaza"     "44"   "27.76" 
##  [3,] "Paez"      "181"  "115.65"
##  [4,] "Neiva"     "16"   "13.34" 
##  [5,] "Yaguara"   "14"   "9.27"  
##  [6,] "Saldaña"   "310"  "33.55" 
##  [7,] "Bogotá"    "39"   "6.51"  
##  [8,] "Sumapaz"   "43"   "13.69" 
##  [9,] "Totaré"    "7"    "4.59"  
## 
## $data_frame
##  [1] "1978-01-01" "1979-02-12" "1980-02-15" "1981-01-29" "1982-01-25"
##  [6] "1983-01-02" "1984-02-07" "1985-04-07" "1986-01-25" "1987-03-06"
## [11] "1988-03-25" "1989-02-07"

Eliminar un elemento de lista (en este caso la matriz)

lista_ejemp[['matriz']] <- NULL

Revisar que no está en la matriz

lista_ejemp
## $vector
##  [1] "1978-01-01" "1979-02-12" "1980-02-15" "1981-01-29" "1982-01-25"
##  [6] "1983-01-02" "1984-02-07" "1985-04-07" "1986-01-25" "1987-03-06"
## [11] "1988-03-25" "1989-02-07"
## 
## $data_frame
##  [1] "1978-01-01" "1979-02-12" "1980-02-15" "1981-01-29" "1982-01-25"
##  [6] "1983-01-02" "1984-02-07" "1985-04-07" "1986-01-25" "1987-03-06"
## [11] "1988-03-25" "1989-02-07"