Este es un concepto amplio en R. Para entender mejor las posibilidades, puede resultar útil considerar la dimensionalidad de la entrada y la salida de las distintas funciones.
Ya hemos visto funciones que reciben un vector y devuelven un único valor de tipo escalar:
> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15
Muchas funciones estadísticas también pertenecen a esta categoría, como mean().
Para vectores lógicos, existen all() y any().
Muchas funciones de R operan sobre vectores completos y a menudo devuelven un vector como resultado. Esto incluye la mayoría de las funciones matemáticas:
> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5
No solo es conciso y cómodo, ya que evita tener que usar bucles, comprensiones de listas o recursión, algo habitual en otros lenguajes. En R, las funciones vectoriales suelen ejecutarse mucho más rápido que esas técnicas.
Para ordenar un vector, sort() devuelve los valores y order() devuelve los índices:
> v <- c("I", "am", "not", "in", "order")
> sort(v)
#> [1] "am" "I" "in" "not" "order"
> order(v)
#> [1] 2 1 4 3 5
Por defecto, la ordenación es ascendente.
Indica decreasing = TRUE si es necesario, o usa rev() para invertir un vector existente.
v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not" "in" "I" "am"
rev(1:4)
#> [1] 4 3 2 1
También hay funciones que producen resultados vectoriales acumulativos y que operan sobre el vector de entrada de izquierda a derecha:
> cumsum(1:5)
#> [1] 1 3 6 10 15 # sums
> cumprod(1:5)
#> [1] 1 2 6 24 120 # equivalent to factorials
Una extensión de este concepto también sirve para comparar vectores.
Por ejemplo, considera la función pmax(), que calcula el máximo por pares:
> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
Eres un ávido observador de aves que lleva la cuenta de cuántos pájaros han visitado tu jardín en los últimos siete días.
Tienes seis tareas, todas relacionadas con el número de pájaros que han visitado tu jardín.
Implementa la función today() para que devuelva cuántos pájaros han visitado tu jardín hoy. Los recuentos de pájaros están ordenados por día, siendo el primer elemento el recuento del día más antiguo y el último elemento el recuento de hoy.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1
Implementa la función increment_todays_count() para incrementar el recuento de hoy:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)
Implementa la función has_day_without_birds() que devuelve TRUE si hubo un día en el que cero pájaros visitaron el jardín; en caso contrario, devuelve FALSE:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true
Implementa la función count_for_first_days() que devuelve el número de pájaros que han visitado tu jardín desde el principio de la semana, pero limita el recuento al número de días especificado desde el principio de la semana.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14
Algunos días están más ajetreados que otros. Un día ajetreado es aquel en el que cinco o más pájaros han visitado tu jardín.
Implementa la función busy_days() para que devuelva el número de días ajetreados:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2
Tienes curiosidad por saber cuántos pájaros en total han visitado tu jardín en lo que va de semana. Calcula los totales acumulados de cada día.
running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1] 7 13 18 22 25 27 28
Sospechas que las visitas de los pájaros se ven afectadas por patrones de tráfico rodado cercano, por lo que son diferentes los fines de semana que entre semana.
Ordena las abreviaturas de los días en orden descendente según cuántos pájaros visitaron.
day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"
Regístrate en Exercism para aprender y dominar R con 21 conceptos111 ejercicios y mentoría humana real, todo gratis.