viernes, 17 de julio de 2015

Transformación de selecciones booleanas a selecciones indexadas

[Lenguajes: R]

Problema

En R, una de las técnicas para seleccionar porciones de conjuntos de datos a partir de condiciones dadas, es por medio de la utilización de índices booleanos creados a partir de expresiones lógicas. Por ejemplo, si tenemos un vector numérico como el que sigue:

V <- c(18, 8, 5, 41, 8, 7)
V
## [1] 18  8  5 41  8  7

y se quiere saber para cuáles de estos números, su valor absoluto menos nueve es menor que tres, lo podemos hacer con la expresión lógica:

( L <- abs(V - 9) <= 3 )
## [1] FALSE  TRUE FALSE FALSE  TRUE  TRUE

Esta expresión, es un vector lógico, paralelo al original, que indica con el valor TRUE, los correspondientes valores de V que cumplen con la condición.

Para saber cuáles son los valores que cumplen con la condición, simplemente se usa como índice el vector lógico resultante, L, en el vector numérico original, V:

V[L]
## [1] 8 8 7

Sin embargo, a veces, estmos realmente interesados en los índices numéricos de los elementos de V que cumplen con la condición, esto es, 2, 5 y 6.

Solución

La función which() transforma los índices booleanos a índices numéricos enteros, de la siguiente manera:

which(L)
## [1] 2 5 6

Un resultado similar se puede obtener si se usa una secuencia numérica, de 1 hasta el número de elementos en V, esto es, 1, 2, …, length(V), y se sustraen los elementos marcados como verdaderos en L, como se muestra a continuación:

seq_along(V)[L]
## [1] 2 5 6
# o también:
seq_along(L)[L]
## [1] 2 5 6

Si quieres ver este mismo post en mis publicaciones de Rpubs:


No hay comentarios.:

Publicar un comentario