Tracks
/
R
R
/
Temario
/
Funciones vectoriales
Fu

Funciones vectoriales en R

1 ejercicio

Acerca de Funciones vectoriales

Este es un concepto importante en R. Para ayudar a entender las posibilidades, puede ser útil considerar la dimensionalidad de los argumentos y el resultado de las distintas funciones.

Vector de entrada, escalar de salida

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 están en esta categoría, como mean().

Para vectores lógicos están all() y any(), que devuelven un único TRUE o FALSE.

Vector de entrada, vector de salida

Muchas funciones de R operan sobre vectores completos, y a menudo producen como resultado otro 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 solo es conciso y cómodo, sino que evita la necesidad de bucles, comprensiones de listas o recursión, que son comunes en otros lenguajes. En R, las funciones vectorizadas suelen ejecutarse mucho más rápido que esas técnicas.

Ya usaste funciones vectorizadas más de lo que probablemente crees. Compara estas:

v <- c(2, 7, 9)
w <- c(3, 1, 5)
v + w
#> [1]  5  8 14
"+"(v, w)
#> [1]  5  8 14

¡Los conocidos operadores infijos no son más que azúcar sintáctico para la función vectorizada subyacente! En este caso, "+"().

Para ordenar un vector, está sort(), que devuelve los valores, y order(), que 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, se ordena en orden 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 como cumsum() y cumprod() que, operando de izquierda a derecha sobre el vector, producen resultados vectoriales acumulativos:

cumsum(1:5)
#> [1]  1  3  6 10 15  # sums
cumprod(1:5)
#> [1]   1   2   6  24 120 # equivalent to factorials

Los ejemplos anteriores son similares a las operaciones foldl de muchos lenguajes funcionales, con la diferencia de que el resultado es un vector con todos los valores intermedios.

Varios vectores de entrada, vector de salida

Una extensión de este concepto también se puede usar para comparar vectores. Por ejemplo, considera la función de máximo por pares pmax():

v
#> [1] 2 7 9
w
#> [1] 3 1 5
pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison

Esta función y otras similares también aceptan un número arbitrario de vectores, no solo dos.

El ejemplo anterior usa vectores de la misma longitud. Como se explica en el concepto Filtrado de vectores, R usa el reciclaje para extender vectores que de alguna forma son «demasiado cortos». Lo repito: usa esto con cuidado y, preferiblemente, solo con un vector de longitud 1.

pmax(v, 5)
#> [1] 5 7 9

Vector de entrada, matriz de salida

Esto es menos común, pero es bastante fácil escribir funciones que aparentemente reciben un escalar y producen un vector. Cuando se aplican a un vector, el resultado es una matrix bidimensional (que se cubre en un concepto posterior).

Editar en GitHub El enlace se abre en una ventana o pestaña nueva

Aprende Funciones vectoriales