variable valores valor una reemplazar redefinir por modificar data como columna cambiar buscar r replace

redefinir - Reemplazar todos los valores en una matriz<0.1 con 0



modificar variables en r (6)

Tengo una matriz (2601 por 58) de las estimaciones de concentración de materia particulada de un modelo de calidad del aire. Debido a que los monitores de la calidad del aire de la vida real no pueden medir por debajo de 0.1 ug / L, necesito reemplazar todos los valores en mi matriz que son <0.1 con un valor nulo / NA / nulo.

Alguien sugirió ifelse(test, true, false) con una declaración lógica, pero cuando intento esto, elimina todo.


Creo que encontrará que ''ifelse'' no es una operación vectorial (en realidad funciona como un bucle), por lo que es órdenes de magnitudes más lentas que el vector equivalente. R favorece las operaciones vectoriales, por lo que aplicar, mapply, sapply son rapidísimos para ciertos cálculos.

Conjuntos de datos pequeños, no es un problema, pero si tiene una variedad de 100k de longitud o más, puede ir y cocinar una cena de asado antes de que termine bajo cualquier método que implique un ciclo.

El siguiente código debería funcionar.

Para vector

minvalue <- 0 X[X < minvalue] <- minvalue

Para Dataframe o Matrix.

minvalue <- 0 n <- 10 #change to whatever. columns <- c(1:n) X[X[,columns] < minvalue,columns] <- minvalue

Otro método rápido, a través de las funciones pmax y pmin, esto limita las entradas entre 0 y 1 y puede poner una matriz o un marco de datos como primer argumento sin problemas.

ulbound <- function(v,MAX=1,MIN=0) pmin(MAX,pmax(MIN,v))


Otros métodos equivalentes:

dejar:

M=matrix(rnorm(10*10), 10, 10)

Fuerza bruta (educativa)

for (i in 1:nrow(M)) { for (j in 1:ncol(M)) if (M[i,j]<0.1 & !is.na(M[i,j]) ) M[i,j]=NA }

Si hay valores faltantes (NA) en M, omitir !is.na dará errores.

Otra forma: usando recode en paquete de car :

library(car) recode(M, "lo:0.099999=NA")

Aquí no se puede especificar una desigualdad estricta, por eso hay un montón de 9. Pongan más nueves y se conviertan en 0.1. lo es una conveniencia de recode, que da el valor mínimo (eliminar NA).


Solo para proporcionar una alternativa (en mi opinión) interesante:

Si necesita ajustar los valores para que nunca sean más pequeños que un valor, puede usar pmax :

set.seed(42) m <- matrix(rnorm(100),10) m <- pmax(m, 0) # clamp negative values to 0

... Sin embargo, esto no funciona en su caso, ya que quiere que los valores <0.1 se conviertan en 0.


Una solución de data.frame:

if(!require(plyr)){ install.packages("plyr")} rm.neg<-colwise(function(x){ return(ifelse(x < 0.1, 0, x))}) rm.neg(data.frame(mat))

PD: el código para rm.neg se puede extraer y simplificar para no necesitar una llamada a plyr, que se usa para crear la función colwise.


ifelse debería funcionar:

mat <- matrix(runif(100),ncol=5) mat <- ifelse(mat<0.1,NA,mat)

Pero elegiría la respuesta de Harlan sobre la mía.

mat[mat < 0.1] <- NA


X[X < .1] <- 0

(o NA, aunque 0 suena más apropiado en este caso).

Las matrices son solo vectores con dimensiones, por lo que puedes tratarlas como un vector cuando las asignas. En este caso, está creando un vector booleano sobre X que indica los valores pequeños, y asigna el lado derecho a cada elemento que sea VERDADERO.