用0replacematrix<0.1中的所有值

我有一个来自空气质量模型的颗粒物质浓度估计matrix(260×58)。 由于实际的空气质量监测器不能测量低于0.1微克/升,我需要replace我的matrix中的所有值<0.1与零/ NA /空值。

有人用逻辑语句提示了ifelse(test, true, false) ,但是当我尝试这个时,它删除了所有东西。

ifelse应该工作:

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

但是我会select哈伦的答案。

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

(或NA,尽pipe在这种情况下听起来更合适)。

matrix只是具有维度的向量,所以当您分配给它们时,您可以将它们当作向量对待。 在这种情况下,你要在X上创build一个布尔向量来表示小的值,并且把右边赋给每个真值为TRUE的元素。

只是提供一个(在我看来)有趣的select:

如果你需要钳制这些值,所以它们永远不会小于一个值,你可以使用pmax

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

…虽然你希望值<0.1变成0,但这并不适用于你的情况。

一个data.frame解决scheme:

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

PS:可以提取和简化rm.neg的代码,从而不需要调用plyr来创buildcolwise函数。

我想你会发现'ifelse'不是一个向量操作(它实际上是作为一个循环执行的),所以它的大小顺序比向量等价。 R有利于vector操作,这就是为什么应用,mapply,sapply在某些计算中闪电般快速。

小数据集,不是问题,但是如果你有一个长度为100k或更长的数组,你可以在任何涉及循环的方法结束之前去做一个烤晚餐。

下面的代码应该工作。

为vector

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

对于Dataframe或Matrix。

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

另一个快速的方法,通过pmax和pmin函数,这个上限在0和1之间,你可以把一个matrix或数据框作为第一个参数没有问题。

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

其他等效方法:

让:

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

蛮力(教育)

 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 } 

如果M中有缺失值(NA),则忽略!is.na会给出错误。

另一种方式:在car使用recode

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

在这里不能指定一个严格的不等式,所以这就是为什么有一堆9.放多个九,它变成0.1。 lo是recode的一个方便,它给出了最小值(删除NAs)。