Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 替换矩阵中的所有值<;0.1加0_R_Replace - Fatal编程技术网

R 替换矩阵中的所有值<;0.1加0

R 替换矩阵中的所有值<;0.1加0,r,replace,R,Replace,我有一个根据空气质量模型估算的颗粒物浓度矩阵(2601 x 58)。由于现实生活中的空气质量监测器无法测量低于0.1 ug/L的空气质量,因此我需要替换矩阵中X[X

我有一个根据空气质量模型估算的颗粒物浓度矩阵(2601 x 58)。由于现实生活中的空气质量监测器无法测量低于0.1 ug/L的空气质量,因此我需要替换矩阵中
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.1
lo
是一种方便的重新编码方式,可提供最小值(删除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))