Remplacer toutes les valeurs d’une masortingce <0.1 par 0

J’ai une masortingce (2601 par 58) des estimations de la concentration en matière particulaire d’un modèle de qualité de l’air. Comme les moniteurs de qualité de l’air ne peuvent pas mesurer moins de 0,1 µg / L, je dois remplacer toutes les valeurs de ma masortingce <0.1 par une valeur zéro / NA / nulle.

Quelqu’un a suggéré ifelse(test, true, false) avec une déclaration logique, mais quand j’essaie cela, il supprime tout.

ifelse devrait fonctionner:

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

Mais je choisirais la réponse de Harlan plutôt que la mienne.

 mat[mat < 0.1] <- NA 
 X[X < .1] <- 0 

(ou NA, bien que 0 sonne plus approprié dans ce cas.)

Les masortingces ne sont que des vecteurs avec des dimensions, vous pouvez donc les traiter comme un vecteur lorsque vous leur affectez. Dans ce cas, vous créez un vecteur booléen sur X qui indique les petites valeurs et assigne le côté droit à chaque élément TRUE.

Juste pour fournir une alternative intéressante (à mon avis):

Si vous devez bloquer les valeurs pour qu’elles ne soient jamais inférieures à une valeur, vous pouvez utiliser pmax :

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

... Cela ne fonctionne pas dans votre cas puisque vous voulez que les valeurs <0.1 deviennent 0.

Autres méthodes équivalentes:

laisser:

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

Force brute (éducatif)

 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 } 

S'il y a des valeurs manquantes (NA) dans M, omettre !is.na donnera des erreurs.

Une autre façon: utiliser recode dans le paquet car :

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

Je ne peux pas spécifier d'inégalité ssortingcte ici, c'est pourquoi il y a un tas de 9. Mettez plus de neuf et ça se transforme en 0.1. lo est une commodité de recoder, qui donne la valeur minimale (suppression des NA).

Une solution 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)) 

PS: le code pour rm.neg peut être extrait et simplifié pour ne pas avoir besoin d'un appel à plyr, qui est utilisé pour créer la fonction colwise.

Je pense que vous constaterez que «ifelse» n’est pas une opération vectorielle (son fonctionnement est en fait une boucle), et donc des ordres de grandeur plus faibles que l’équivalent vectoriel. R favorise les opérations vectorielles, c’est pourquoi appliquer, mapply, sapply est rapide pour certains calculs.

Petits ensembles de données, ce n’est pas un problème, mais si vous avez un tableau de longueur 100k ou plus, vous pouvez préparer un dîner rôti avant qu’il ne soit fini par une méthode impliquant une boucle.

Le code ci-dessous devrait fonctionner.

Pour vecteur

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

Pour Dataframe ou Masortingx.

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

Une autre méthode rapide, via les fonctions pmax et pmin, coche les entrées entre 0 et 1 et vous pouvez placer une masortingce ou un dataframe comme premier argument.

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