Tiempo estimado de lectura < 1 min
Esta publicación llega gracias a un compañero de trabajo, una persona que es capaz de integrar en su cabeza rápidamente el paradigma de un lenguaje y de sacar gran provecho de éste.
Él mismo me pregunto que, en R, cómo se podrían seleccionar los elementos impares de un vector. Por lo general, en cualquier lenguaje, a priori, este problema puede resolverse con un bucle, de tal forma que “para cada posición, si al dividirla entre 2 da de resto 1, es impar“, utilizando la opción módulo. Pero claro, R no es un lenguaje para ser utilizado con bucles… o eso dicen, en tanto que su paradigma es vectorial.
Así pues, tras unos cinco minutos viene mi compañero y me presenta una solución hipersencilla y elegante: “un_vector[c(F,T)]“. Lo que dice la expresión es, básicamente, “toma los elementos de mi vector ‘un_vector’ cuando el elemento correspondiente del vector (F,T,F,T,F,T…), que mide tanto como ‘un_vector’, sea verdadero“.
En base a esto he escrito un par de funciones (explicadas en el propio código) que pueden resultar útiles:
[code language=”r”]
# "f_pares" devuelve los elementos de las posiciones pares
f_pares <- function (x){ return (x[c(F,T)]); };
# "f_impares" devuelve los elementos de las posiciones impares
f_impares <- function (x){ return (x[c(T,F)]); };
# "f_serie" devuelve el elemento de la posición "k", y después
# un elemento cada "m" posiciones hasta el final del vector
f_serie <- function (x, m, k=1){ return (c(x[k], x[(k+1):length(x)][c(rep(F,m-1),T)])); };
# Ejemplos de ejecución:
f_pares(c(1:15))
f_impares(c(1:15))
f_serie (x=c(1:30), m= 5, k=1)
f_serie (x=c(1:30), m= 2)
f_serie (x=c(1:30), m= 2, k=2)
f_serie (x=c(1:30), m= 29, k=1)
f_serie (x=c(as.character(1:30)), m= 6, k=4)
[/code]
Éste ha sido la primera publicación de Tips. Espero traer alguna más.
¡Ciao!