R nivel1

Author

Bryan Quispe

Published

Saturday, December 3, 2022

1 Descarga de datos desde URL

# Luego descargamos a partir del link de descarga
link <- "https://gml.noaa.gov/webdata/ccgg/trends/co2/co2_annmean_mlo.txt"
download.file(url = link, destfile = "mauna.csv")

# Importamos los datos del csv
datos1 <- read.table(file = "mauna.csv")
names(datos1) <- c("year","meanCO","UC")
head(datos1)
  year meanCO   UC
1 1959 315.98 0.12
2 1960 316.91 0.12
3 1961 317.64 0.12
4 1962 318.45 0.12
5 1963 318.99 0.12
6 1964 319.62 0.12
# Guardamos la nueva tabla de datos
write.table(x = datos1, file = "mauna2.csv",
            sep = ",")

2 Operadores y relaciones en R

#operador de asignación
assign("b",c(5,6,5))

2.1 Instrucción “if”

Nos permite ejecutar un bloque de código si se cumple una condición.

x <- 10
if (x>5) {
  print("Operación exitosa")
  print("el número es mayor que 5")
}
[1] "Operación exitosa"
[1] "el número es mayor que 5"

2.2 Instrucción “else”

Nos permite ejecutar un código cuando no se cumple la condición evaluada por la instrucción “if”.

x <- 4
if (x>5) {
  print("Operación exitosa")
  print("el número es mayor que 5")
} else {
  print("Operación incorrecta")
  print("El número es menor o igual a 5")
}
[1] "Operación incorrecta"
[1] "El número es menor o igual a 5"

2.3 Instrucción “else if”

Esta instrucción nos permite ejecutar un bloque de código cuando no se cumple con la condición evaluada por la instrucción “if” y se necesite más de una instrucción.

x <- 6
if (x>6) {
  print("Operación exitosa")
  print("el número es mayor que 5")
} else if (x==5){
  print("La operación no se realizó")
  print("El número es igual a 5")
} else if (x==6){
  print("La operación no se realizó")
  print("El número es igual a 6")
} else {
  print("Operación incorrecta")
  print("El número es menor o igual a 5")
}
[1] "La operación no se realizó"
[1] "El número es igual a 6"

2.4 Instrucción “if else”

Nos permite evaluar de manera rápida si contamos con solo una instrucción para “if” y una instrucción para “else”.

x <- 5
ifelse(x>5, "El número es mayor que 5",
       "El número es menor o igual que 5")
[1] "El número es menor o igual que 5"

2.5 Instrucción “for”

Es una manera de repetir alguna función o líneas de código mientras se cumple determinadas condiciones. Es útil para repetir un procedimiento una cierta cantidad de veces.

x <- c(20, 15, 17, 18, 20, 25, 26, 29)
# Creamos un vector vacío
vector <- c()
for (i in 1:length(x)) {
  z <- x[i]*2
  vector[i] <- z+i
  print(paste("El número es:",vector[i]))
}
[1] "El número es: 41"
[1] "El número es: 32"
[1] "El número es: 37"
[1] "El número es: 40"
[1] "El número es: 45"
[1] "El número es: 56"
[1] "El número es: 59"
[1] "El número es: 66"
print(paste("El número es:", vector, 
            sep = " "))
[1] "El número es: 41" "El número es: 32" "El número es: 37" "El número es: 40"
[5] "El número es: 45" "El número es: 56" "El número es: 59" "El número es: 66"

2.6 Instrucción “while”

Es muy útil para repetir un procedimiento siempre que se cumple una condición.

x <- 1
while (x < 10) {
    x <- x+1
    print(x)
}
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

2.7 Instrución “repeat”

Es útil para repetir un procedimiento, usando un “break” para detenerse.

x <- 0
repeat{
  x <- x+1
  print(x)
  if (x==10) {
    break
  }
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

2.8 Instrucción “break”

Nos permite interrumpir un bucle ante una determinada condición.

x <- c(20, 15, 17, 18, 20, 25, 26, 29)
vector <- c()
for (i in 1:length(x)) {
  if(i==4){
    break
  }
  z <- x[i]*2
  vector[i] <- z + i
}
print(vector)
[1] 41 32 37

2.9 Instrucción “next”

Nos permite omitir una iteración en un bucle cuando se cumple determinada condición.

x <- c(20, 15, 17, 18, 20, 25, 26, 29)
vector <- c()
for (i in 1:length(x)) {
  if(i==4){
    next
  }
  z <- x[i]*2
  vector[i] <- z + i
}
print(vector)
[1] 41 32 37 NA 45 56 59 66

2.9.1 Ejercicio 1:

Implementar una función que diga si un número ingresado es par o impar

# Para un solo número:
prueba1 <- function(x){
  if (x%%2==0) {
    print(paste("El número", x, "Es par", sep=))
  } else{
    print(paste("El número", x, "Es impar", sep=))
  }
}

prueba1(5)
[1] "El número 5 Es impar"
prueba1(6)
[1] "El número 6 Es par"
# Para vectores:

xd <- 1:6

p2 <- function(x){
  for (i in 1:length(x)) {
   if (x[i]%%2==0) {
    print(paste("El número", x[i], "Es par", sep=))
  } else{
    print(paste("El número",x[i], "Es impar", sep=))
  } 
  }
  
}

p2(xd)
[1] "El número 1 Es impar"
[1] "El número 2 Es par"
[1] "El número 3 Es impar"
[1] "El número 4 Es par"
[1] "El número 5 Es impar"
[1] "El número 6 Es par"

3 Horarios y fechas

3.0.1 as.Date( )

Sirve para cohercionar elementos de tipo caracter a valores de tipo “date ()”.

# Creamos un objeto se tipo date:
end_year <- as.Date(x = "31/12/2022",format= "%d/%m/%Y")
print(paste("La fecha: ", end_year, " es de tipo ", class(end_year)))
[1] "La fecha:  2022-12-31  es de tipo  Date"
# Si se suma un valor númerico, la clase date lo considera como un día más.
print(paste("El día siguiente al final de este año es: ", end_year+1))
[1] "El día siguiente al final de este año es:  2023-01-01"

3.0.2 format ( )

new_year <- format(x = end_year+1,format="%A, %d de %B del %Y")
print(new_year) # es de tipo caracter
[1] "domingo, 01 de Enero del 2023"

3.1 Secuencias con horarios y fechas

# Creamos una secuencia de fechas
seq(as.Date(x="01-12-2022",format="%d-%m-%Y"),
           as.Date(x="08-12-2022",format="%d-%m-%Y"),
           by="1 day") # day, week, month, etc.
[1] "2022-12-01" "2022-12-02" "2022-12-03" "2022-12-04" "2022-12-05"
[6] "2022-12-06" "2022-12-07" "2022-12-08"

3.1.1 Clase POSIXct y POSIXlt

# Creamos un objeto POSIXct
as.POSIXct("01-12-2022",format="%d-%m-%Y")
[1] "2022-12-01 -05"
# POSIXct con hora, minuto y segundos:
as.POSIXct("01-12-2022 08:00:00", format= "%d-%m-%Y %H:%M:%S",
           tz = "UTC")
[1] "2022-12-01 08:00:00 UTC"
# La fecha actual:
as.POSIXct(Sys.time())
[1] "2023-01-05 19:16:47 -05"

Ejercicio aplicativo 2

Cargar la base de datos del senamhi y realizar transformaciones en las fechas, creando columnas convenientes:

# Cargamos la base de datos:
ta <- read.table(file = "qc00000877.txt",
                 header = F,dec=".",
                 stringsAsFactors = F,
                 na.strings = "-99.9")

names(ta) <- c("año","mes","dia","pp","tmax","tmin")

# creamos la columna de fecha:
# Fechas diarias:
ta$date <- as.POSIXct(x=paste(ta$año,ta$mes,ta$dia, sep = "-"),
                      format= "%Y-%m-%d")

# Fechas mensuales:
ta$mensual <- format(ta$date, format = "%Y-%m")

# Resúmenes de variables:

p_mensual <- aggregate(pp~mensual, data = ta,
                       FUN = sum)

tmax_mensual <- aggregate(tmax~mensual, data = ta,
                          FUN = mean)

tprom_mensual <- aggregate(x=((ta$tmax+ta$tmin)/2)~mensual,
                           data = ta, FUN = mean)

Ejercicio aplicativo 3

Importar la base de datos de promedios mensuales de mauna loa y resolver lo siguiente:

  1. Reduzca el df a las 5 primeras columnas:

    download.file(url ="https://gml.noaa.gov/webdata/ccgg/trends/co2/co2_mm_mlo.txt",
                  destfile = "monthly.csv")
    
    monthy <- read.table(file = "monthly.csv")[,1:5]
    
    names(monthy) <- c("year", "month", "x", "co2_1","co2_2")
  2. Mostrar si faltan datos a la base de datos

    print(paste("Faltan: ", sum(is.na(monthy)), " datos"))
    [1] "Faltan:  0  datos"
  3. Mostrar la clase de objetos de cada columna:

str(monthy)
'data.frame':   778 obs. of  5 variables:
 $ year : int  1958 1958 1958 1958 1958 1958 1958 1958 1958 1958 ...
 $ month: int  3 4 5 6 7 8 9 10 11 12 ...
 $ x    : num  1958 1958 1958 1958 1959 ...
 $ co2_1: num  316 317 318 317 316 ...
 $ co2_2: num  314 315 315 315 315 ...
  1. Convertir las columnas año y mes a columna de clase Date

    monthy$month <- sprintf("%02d",monthy$month) # innecesario xd
    monthy$date <- as.POSIXct(x=paste(monthy$year,
                                  monthy$month,
                                  "01",
                                  sep = "-"),
                          format="%Y-%m-%d")
  2. Mostrar el mes con mayor y menor concentración media de Co_2

    monthy[monthy$co2_1==max(monthy$co2_1),]
        year month        x  co2_1  co2_2       date
    771 2022    05 2022.375 420.99 417.60 2022-05-01
    772 2022    06 2022.458 420.99 418.61 2022-06-01
    monthy[monthy$co2_1==min(monthy$co2_1),]
      year month        x  co2_1  co2_2       date
    8 1958    10 1958.789 312.43 315.41 1958-10-01
  3. Realizar el grafico con linea de tendencia para el año 2018

    monthy[monthy$year==2018,] %>% ggplot(aes(x=date, y=co2_1))+
      geom_point(color="red")+
      geom_line(color="black", lwd=0.6)+
      geom_smooth(stat = "smooth", se=F)

4 Descarga automatizada de datos de Senamhi

Se realizará la descarga de datos de la estación meteorológica automática de “TACNA”

library(RSelenium)
download_senamhi_data <- function(url_list) {

  port <- as.integer(runif(1, min = 5000, max = 6000))
  
  # EJECUTAMOS EL DRIVER DE GOOGLE CHROME 
  rD <- rsDriver(port = port, browser = "chrome", 
                 chromever = "108.0.5359.71")
  
  remDrv <- rD$client
  
  for (url in url_list){
  
  # INGRESAR AL URL
  remDrv$navigate(url)
  
  # ENCONTRAR EL BOTON DE DESCARGA 
  down_button <- remDrv$findElement(using = "id", "export2")
  down_button$clickElement()
  
  }
  # CERRAR LA SESION ACTUAL
  remDrv$close()
  rD$server$stop()
  rm(rD, remDrv)
  gc()
}

# Geneerando las urls
años <- rep(2017:2022,12)
meses <- mes <- sort(sprintf("%02d",rep(1:12,5)))
fechas <- sort(paste0(años,meses))[]

# Generando los links
Estacion_meses <- list()
for (i in fechas) {
  Estacion_meses[i] <- paste0("https://www.senamhi.gob.pe/mapas/mapa-estaciones-2/_dato_esta_tipo02.php?CBOFiltro=",i,"&estaciones=118014&t_e=M&estado=AUTOMATICA&cod_old=&cate_esta=EMA&soloAlt=498")
}

 # download_senamhi_data(Estacion_meses)

4.1 Carga de los datos descargados por descarga automática

directorio <- "C:/Users/bryan/Downloads"
# Guardado de los nombres de archivos
myfiles <- list.files(path=directorio, pattern="*.csv", full.names=TRUE)

tablas <- list()
for (i in 1:length(myfiles)) {
  tablas[[i]] <- read.table(myfiles[i], sep = ",", header = T ,
                           skip = 10 , stringsAsFactors = F, 
                           na.strings = "S/D")
}

# CONCATENAR LOS DATAFRAMES DE LA LISTA
df <- Reduce(function(...) merge(... , all=TRUE), tablas)

library(openxlsx)
write.xlsx(x=df, file = "Estación_tacna.xlsx")
tail(df)
      AÑO...MES...DÍA  HORA TEMPERATURA...C. PRECIPITACIÓN..mm.hora.
10209      2022/12/31 18:00             21.5                       0
10210      2022/12/31 19:00             20.2                       0
10211      2022/12/31 20:00             19.6                       0
10212      2022/12/31 21:00             19.3                       0
10213      2022/12/31 22:00             19.4                       0
10214      2022/12/31 23:00             19.4                       0
      HUMEDAD.... DIRECCION.DEL.VIENTO.... VELOCIDAD.DEL.VIENTO..m.s.
10209          63                      180                        2.7
10210          74                      180                        2.6
10211          78                      180                        2.2
10212          79                      180                        1.5
10213          77                      180                        1.1
10214          76                      180                        0.9

4.2 Tratamiento de datos meteorológicos usando funciones de R

# Carga de la tabla de datos compilada:
data <- read.xlsx("Estación_tacna.xlsx")

names(data) <- c("date","hora","temp","pp",
                 "hum","wd","ws")

data$date2 <- as.POSIXct(x=(paste(data$date,
                                  data$hora,
                                  sep = " ")),
                         format= "%Y/%m/%d %H:%M")
data$date <- data$date2
data$date2 <- NULL


windRose(data, paddle = F, type = "season",hemisphere="southern")