Este es un concepto importante en R. Para ayudarte a entender las posibilidades, puede ser útil considerar la dimensionalidad de las entradas y las salidas de las distintas funciones.
Ya vimos 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 entran en esta categoría, como mean().
Para los vectores lógicos, están all() y any().
Muchas funciones de R operan sobre vectores completos y a menudo su salida también es un vector. 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
Esto no es solo conciso y cómodo, pues evita la necesidad de bucles, comprensiones de listas o recursión, que son comunes 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
De manera predeterminada, el orden es ascendente.
Especifica 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 generan salidas vectoriales acumulativas, recorriendo 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
Te encanta observar aves y llevas la cuenta de cuántas han visitado tu jardín en los últimos siete días.
Tienes seis tareas, todas relacionadas con el número de aves que visitaron tu jardín.
Implementa la función today() para que devuelva cuántas aves visitaron tu jardín hoy. Los conteos de aves están ordenados por día: el primer elemento es el conteo del día más antiguo y el último es el conteo 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 conteo 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 aves visitaron el jardín; de lo 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 aves que han visitado tu jardín desde el inicio de la semana, pero limita el conteo al número de días especificado desde el inicio 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 son más ajetreados que otros. Un día ajetreado es aquel en el que cinco o más aves 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ántas aves han visitado en total lo que va de la semana. Calcula los totales acumulados para 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 aves se ven afectadas por los patrones del tráfico de las carreteras cercanas, que son distintos los fines de semana y entre semana.
Ordena las abreviaturas de los días en orden descendente según cuántas aves 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.