R 替换矩阵中的所有值<;0.1加0
我有一个根据空气质量模型估算的颗粒物浓度矩阵(2601 x 58)。由于现实生活中的空气质量监测器无法测量低于0.1 ug/L的空气质量,因此我需要替换矩阵中R 替换矩阵中的所有值<;0.1加0,r,replace,R,Replace,我有一个根据空气质量模型估算的颗粒物浓度矩阵(2601 x 58)。由于现实生活中的空气质量监测器无法测量低于0.1 ug/L的空气质量,因此我需要替换矩阵中X[X
X[X<0.1]如果其他
可以工作:
mat <- matrix(runif(100),ncol=5)
mat <- ifelse(mat<0.1,NA,mat)
mat仅提供一个(我认为)有趣的替代方案:
如果需要钳制值,使其永远不小于某个值,可以使用pmax
:
set.seed(42)
m <- matrix(rnorm(100),10)
m <- pmax(m, 0) # clamp negative values to 0
set.seed(42)
m其他等效方法:
让我们:
暴力(教育性)
这里不能指定一个严格的不等式,所以这里有一堆9。再加上9,它就会变成0.1lo
是一种方便的重新编码方式,可提供最小值(删除NAs)。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))
if(!require(plyr)){
install.packages(“plyr”)}
rm.neg我想你会发现“ifelse”不是一个向量运算(它实际上作为一个循环执行),因此它比向量等价物慢几个数量级。R支持向量运算,这就是为什么apply、mapply和sapply在某些计算中速度极快的原因
小数据集,这不是问题,但如果您有一个长度为100k或更大的数组,您可以使用任何涉及循环的方法,在它结束之前烹饪一顿烤晚餐
下面的代码应该可以工作
矢量
minvalue <- 0
X[X < minvalue] <- minvalue
minvalue关于用什么替换负值或零值的问题是一个有趣的问题。因为很多模型都是建立在对数(y)的基础上的,所以我经常将它们替换为法线下限和零之间的中点。(可能是第二个问题,最好在stats.exchange上提出。)@Dwin,+1。我想看看第二个问题,它是crossvalidated.com上的答案。这是一个有趣的评论-我明白你在说什么。。。在上下文中,我使用这些值与急诊科数据进行回归(人口流行病学研究)。我被解释为什么要替换@mEvans:interest。“零膨胀”是指处理过多零的模型,因此您很可能正在创建一种数据情况,需要正确处理“零膨胀数据”的分析。此问题的框架解决方案?您可以仅对某些列执行此操作吗?当我在整个矩阵上运行它时,它会替换其他列中的其他值(如日期和时间等)。对于COL的子集,您可以使用:X[,c(1,3,5)]@mEvans:如果在不同的列中有不同类型的数据,这意味着您可能有一个数据框,而不是矩阵。在R中,这些是不同的生物,尽管许多操作将同时使用这两种生物。在做任何其他事情之前,您应该检查您的数据集是什么,因为这可能会在以后为您节省很多痛苦。@jbaums这对矩阵很有效,但对向量无效。例如,案例X[,1](仅使用1列)失败,因为dim(X[,1])=NULL。困扰我的是,函数描述说它可以处理向量(有长度,但没有维度)和矩阵(有长度和维度)。@GuilhermeSalomé-你可以添加drop=FALSE
,以确保它可以处理单个列。ifelse的问题是它似乎把我的矩阵变成了向量。。。我能把它改造成矩阵吗?@mEvans我不行!如果我粘贴我的代码,我得到矩阵回来。。。但是,可以使用矩阵(mat)
将向量
转换为矩阵
。再看看matrix
的所有可选参数。但是,正如我在回答中所说的,我认为哈兰的答案是最好的。
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
}
library(car)
recode(M, "lo:0.099999=NA")
if(!require(plyr)){
install.packages("plyr")}
rm.neg<-colwise(function(x){
return(ifelse(x < 0.1, 0, x))})
rm.neg(data.frame(mat))
minvalue <- 0
X[X < minvalue] <- minvalue
minvalue <- 0
n <- 10 #change to whatever.
columns <- c(1:n)
X[X[,columns] < minvalue,columns] <- minvalue
ulbound <- function(v,MAX=1,MIN=0) pmin(MAX,pmax(MIN,v))