R nivel1

Author

Bryan Quispe

Published

Saturday, December 3, 2022

1 Descarga de datos desde URL

# Primero seleccionamos nuestro directorio de trabajo:
setwd("C:/Users/bryan/Downloads/1. Básico/Avance_files/directorio")

# 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"

2.10 Horarios y fechas

2.10.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"

2.10.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"

2.11 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"

2.11.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] "2022-12-09 15:26:15 -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':   777 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 ...
  4. 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")
  5. 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
  6. 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)
    Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
    ℹ Please use `linewidth` instead.
    `geom_smooth()` using method = 'loess' and formula = 'y ~ x'