Foro de debate

sobre la función which()

sobre la función which()

de Igor Gutiérrez -
Número de respuestas: 1
Buenas:

La función which() me resulta muy útil porque permite seleccionar observaciones que cumplen una determinada condición y hacer con ellas toda serie de manipulaciones.

Sin embargo me he encontrado con un pequeño límite y me gustaría lanzar pregunta sobre el tema.

Supongamos que queremos graficar una variable y resaltar de azul aquellos puntos (observaciones) que cumplan una determinada condición. Esto se haría de la siguiente manera:

>plot(variable)
>points(which(condición),variable[which(condición)], col='blue')

Hasta aquí ningún problema. Ahora bien, supongamos que queremos graficar la misma variable pero con sus valores ordenados de menor a mayor. Esto lo estoy haciendo de la siguiente manera:

>plot(sort(variable))

Ahora me gustaría resaltar en azul aquellos puntos de la gráfica que cumplan la condición. Sin embargo, si hago

>points(which(condición), (sort(variable))[which(condición)], col='blue')

las abcisas no son precisamente las que yo busco, pues no van emparejadas con la ordenada que les correspondería, ya que éstas últimas han sido reordenadas de menor a mayor según los valores de mi variable.

Para solucionar este problema he probado con las funciones sort() y order() pero no acabo de dar con la forma correcta. Lo único que me ha funcionado es ordenar todo el dataframe según mi variable (hay funciones desarrolladas por otros como sort.data.frame()) y luego trabajar como si no hiciera falta ordenar.

Supongo que habrá una forma más ágil.

Muchas gracias de antemano
En respuesta a Igor Gutiérrez

Re: sobre la función which()

de Manuel Muñoz Márquez -
Buenas:

Una tendencia natural cuando uno se inicia en un lenguaje de programación es hacer las cosas igual que en los lenguajes que uno conoce, esto habitualmente conlleva un subaprovechamiento de las posibilidades del lenguaje, en este caso R.

Una solución a tu problema podría consistir en usar una variable auxiliar para reordenar simultáneamente las ordenadas y las abscisas:

# Generación de datos aleatorios
y <- runif(10)

# Obtención del vector de posiciones ordenadas
indice <- sort(y, index.return=TRUE)$ix

# Reordenación de las variables
x <- 1:10
nx <- x[indice]
ny <- y[indice]

# Filtrar las que verifican la condición
xx <- nx[ny>.5]
yy <- ny[ny>.5]

# Hacer las gráficas
plot(x, y)
points(xx, yy, col='blue')


Una solución distinta, que creo que hace lo que quieres, mucho más eficiente usando R es:
y <- runif(10)
indice <- sort(y, index.return=TRUE)$ix
x <- 1:10
nx <- x[indice]
ny <- y[indice]

mycol <- rep('black', 10)
mycol[ny>.5] <- 'blue'
plot(nx, ny, col=mycol)

En esta solución se trabaja sobre el vector de colores.

Saludos.