9.1 if, else

if (si) es usado cuando deseamos que una operación se ejecute únicamente cuando una condición se cumple.

else (de otro modo) es usado para indicarle a R qué hacer en caso de la condición de un if no se cumpla.

Un if es la manera de decirle a R:

  • SI esta condición es cierta, ENTONCES haz estas operaciones.

El modelo para un if es:

if(Condición) {
  operaciones_si_la_condición_es_TRUE
}

Si la condición se cumple, es decir, es verdadera (TRUE), entonces se realizan las operaciones. En caso contrario, no ocurre nada y el código con las operaciones no es ejecutado.

Por ejemplo, le pedimos a R que nos muestre el texto “Verdadero” si la condición se cumple.

# Se cumple la condición y se muestra "verdadero"
if(4 > 3) {
  "Verdadero"
}
## [1] "Verdadero"
# No se cumple la condición y no pasa nada
if(4 > 5) {
  "Verdadero"
}

else complementa un if, pues indica qué ocurrirá cuando la condición no se cumple, es falsa (FALSE), en lugar de no hacer nada.

Un if con else es la manera de decirle a R:

  • SI esta condición es es cierta, ENTONCES haz estas operaciones, DE OTRO MODO haz estas otras operaciones.

El modelo para un if con un else es:

if(condición) {
  operaciones_si_la_condición_es_TRUE
} else {
  operaciones_si_la_condición_es_FALSE
}

Usando los ejemplos anteriores, podemos mostrar “Falso” si no se cumple la condición, en lugar de que no ocurra nada.

# Se cumple la condición y se muestra "Verdadero"
if(4 > 3) {
  "Verdadero"
} else {
  "Falso"
}
## [1] "Verdadero"
# No se cumple la condición y se muestra "Falso"
if(4 > 5) {
  "Verdadero"
} else {
  "Falso"
}
## [1] "Falso"

9.1.1 Usando if y else

Para ilustrar el uso de if else definiremos una función que calcule el promedio de calificaciones de un estudiante y, dependiendo de la calificación calculada, nos devuelva un mensaje específico.

Empezamos definiendo una función para calcular promedio. En realidad, sólo es la aplicación de la función mean() ya existente en R base, pero la ampliaremos después.

promedio <- function(calificaciones) {
  mean(calificaciones)
}

promedio(c(6, 7, 8, 9, 8))
## [1] 7.6
promedio(c(5, 8, 5, 6, 5))
## [1] 5.8

Ahora deseamos que esta función nos muestre si un estudiante ha aprobado o no.

Si asumimos que un estudiante necesita obtener 6 o más de promedio para aprobar, podemos decir que:

  • SI el promedio de un estudiante es igual o mayor a 6, ENTONCES mostrar “Aprobado”, DE OTRO MODO, mostrar “Reprobado”.

Aplicamos esta lógica con un if, else en la función promedio().

promedio <- function(calificaciones) {
  media <- mean(calificaciones)
  
  if(media >= 6) {
    print("Aprobado")
  } else {
    print("Reprobado")
  }
}

Probemos nuestra función

promedio(c(6, 7, 8, 9, 8))
## [1] "Aprobado"
promedio(c(5, 8, 5, 6, 5))
## [1] "Reprobado"

Está funcionando, aunque los resultados podrían tener una mejor presentación.

Usaremos la función paste0() para pegar el promedio de calificaciones, como texto, con el resultado de “Aprobado” o “Reprobado”. Esta función acepta como argumentos cadenas de texto y las pega (concatena) entre sí, devolviendo como resultado una nueva cadena.

Primero concatenaremos la palabra “Calificación:” a la media obtenida con la función promedio() y después el resultado de esta operación con la palabra “aprobado” o “reprobado”, según corresponda.

promedio <- function(calificaciones) {
  media <- mean(calificaciones)
  texto <- paste0("Calificación: ", media, ", ")
  
  if(media >= 6) {
    print(paste0(texto, "aprobado"))
  } else {
    print(paste0(texto, "reprobado"))
  }
}

Pongamos a prueba nuestra función.

promedio(c(6, 7, 8, 9, 8))
## [1] "Calificación: 7.6, aprobado"
promedio(c(5, 8, 5, 6, 5))
## [1] "Calificación: 5.8, reprobado"

Por supuesto, como lo vimos en el capítulo sobre funciones, podemos hacer aún más compleja a promedio(), pero esto es suficiente para conocer mejor las aplicaciones de if else.

9.1.2 ifelse

La función ifelse( ) nos permite vectorizar if, else. En lugar de escribir una línea de código para cada comparación, podemos usar una sola llamada a esta función, que se aplicará a todos los elementos de un vector.

Si intentamos usar if else con un vector, se nos mostrará una advertencia.

if(1:10 < 3) {
  "Verdadero"
}
## Warning in if (1:10 < 3) {: the condition has length > 1 and only the first
## element will be used
## [1] "Verdadero"

Este mensaje nos dice que sólo se usará el primer elemento del vector para evaluar su la condición es verdadera y lo demás será ignorado.

En cambio, con ifelse se nos devolverá un valor para cada elemento de un vector en el que la condición sea TRUE, además nos devolverá otro valor para los elementos en que la condición sea FALSE.

Esta función tiene la siguiente forma.

ifelse(vector, valor_si_TRUE, valor_si_FALSE)

Si intentamos el ejemplo anterior con ifelse(), se nos devolverá un resultado para cada elemento del vector, no sólo del primero de ellos.

##  [1] "Verdadero" "Verdadero" "Falso"     "Falso"     "Falso"    
##  [6] "Falso"     "Falso"     "Falso"     "Falso"     "Falso"

De este modo podemos usar ifelse() para saber si los números en un vector son pares o nones.

num <- 1:8

ifelse(num %% 2 == 0, "Par", "Non")
## [1] "Non" "Par" "Non" "Par" "Non" "Par" "Non" "Par"

También tenemos la opción de crear condiciones más complejas usando operadores Booleanos.

Por ejemplo, pedimos sólo los números que son exactamente divisibles entre 2 y 3.

num <- 1:20

ifelse(num %% 2 == 0 & num %% 3, "Divisible", "No divisible")
##  [1] "No divisible" "Divisible"    "No divisible" "Divisible"   
##  [5] "No divisible" "No divisible" "No divisible" "Divisible"   
##  [9] "No divisible" "Divisible"    "No divisible" "No divisible"
## [13] "No divisible" "Divisible"    "No divisible" "Divisible"   
## [17] "No divisible" "No divisible" "No divisible" "Divisible"

Desde luego, esto es particularmente útil para recodificar datos.

num <- c(0, 1, 0, 0, 0, 1, 1)

num <- ifelse(num == 0, "Hombre", "Mujer")

num
## [1] "Hombre" "Mujer"  "Hombre" "Hombre" "Hombre" "Mujer"  "Mujer"