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).
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.
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"
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
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
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
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"
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
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"
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
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
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
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"
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"
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
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
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)
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:
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")
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)
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
lista_ejemp <- list(vector_fecha,
matriz_afluentes)
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"
names(lista_ejemp) <- c('vector','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"
##
## $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"
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"
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"