Índice

El siguiente artículo es una traducción de una pregunta en StackOverflow del usuario algui91, que preguntaba Vectorize access to columns in R. La respuesta es del usuario David Arenburg.

En unas prácticas de Aprendizaje automático para la facultad en las que usamos R. Me surgió un problema intentando vectorizar el acceso a un Data set por columnas, así que pregunté en StackOVerflow.



El objetivo era dado un data set relleno de 1 y -1, cambiar el valor de un 10% de unos a -1, y de un 10% de -1 a 1. Los datos eran algo así:

          x         y f1 f2 f3 f4
1  76.71655  60.74299  1  1 -1 -1
2 -85.73743 -19.67202  1  1  1 -1
3  75.95698 -27.20154  1  1  1 -1
4 -82.57193  39.30717  1  1  1 -1
5 -45.32161  39.44898  1  1 -1 -1
6 -46.76636 -35.30635  1  1  1 -1

En un principio obtenía el 10% así:

indexPositive = sample(which(datafsign$result == 1), nrow(datafsign) * .1)

obteniendo así un 10% de los índices a cambiar, pero solo de una columna. Yo quería generalizar al máximo posible y obtenerlo para las 4 columnas que se ven en el ejemplo anterior. Al final, con la ayuda de David Arenburg, cree el siguiente código:

getPercentageOfData <- function(x, condition = 1, percentage = .1){
  # Get the percentage of samples that meet condition
  #
  # Args:
  #   x: A vector containing the data
  #   condition: Condition that the data need to satisfy
  #   percentaje: What percentage of samples to get
  #
  # Returns:
  #   Indexes of the percentage of the samples that meet the condition
  meetCondition = which(x == condition)
  sample(meetCondition, length(meetCondition) * percentage)
}

Lo cual me permitía pasarle como parámetro tantas columnas como quisiera cambiar:

# Get a 10% of samples labeled with a 1 in all 4 functions
indexPositive = lapply(datafunctions[3:6], getPercentageOfData)
# Change 1 by -1
datafunctions$f1[indexPositive$f1] = -1
datafunctions$f2[indexPositive$f2] = -1
datafunctions$f3[indexPositive$f3] = -1
datafunctions$f4[indexPositive$f4] = -1

Y conseguir así lo que quería hacer.

Para cambiar los -1 por 1 basta llamar al a función con un parámetro más, el de condición:

indexNegative = lapply(datafunctions[3:6], getPercentageOfData, condition = -1)

Fuente

Vectorize access to columns in R | stackoverlow.com