用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)。