我有一个从空气质量模型估计的颗粒物浓度矩阵(2601乘58)。因为现实生活中的空气质量监测仪不能测量低于0.1ug/L的值,所以我需要将矩阵中所有为<0.1的值替换为0/NA/null值。
有人建议使用ifelse(test, true, false)的逻辑语句,但当我尝试这样做时,它会删除所有内容。
发布于 2012-02-25 07:48:43
ifelse应该可以工作:
mat <- matrix(runif(100),ncol=5)
mat <- ifelse(mat<0.1,NA,mat)但我会选择哈兰的答案而不是我的。
mat[mat < 0.1] <- NA发布于 2012-02-25 07:47:46
X[X < .1] <- 0(或NA,尽管在这种情况下0听起来更合适。)
矩阵就是有维数的向量,所以当你给它们赋值时,你可以把它们当作一个向量来对待。在本例中,您将在X上创建一个表示小值的布尔向量,并将右侧赋值给每个为TRUE的元素。
发布于 2012-12-06 19:19:16
我想你会发现'ifelse‘不是一个向量运算(它实际上是一个循环),所以它比向量等效项慢了几个数量级。R偏爱向量运算,这就是为什么apply,mapply,sapply对于某些计算来说是闪电般的快。
小的数据集,不是问题,但是如果你有一个长度为100k或更多的数组,你可以在任何涉及循环的方法下,在它完成之前做一顿烤肉晚餐。
下面的代码应该可以工作。
对于向量
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之间,您可以将矩阵或数据帧作为第一个参数,没有问题。
ulbound <- function(v,MAX=1,MIN=0) pmin(MAX,pmax(MIN,v))https://stackoverflow.com/questions/9439619
复制相似问题