我是 R 和这个网站的新手。我的目标是创建一个 R 函数,在 ggplot2 中生成特殊类型的箱线图,这肯定是不必要的晦涩难懂的代码。我首先需要通过计算稍后希望绘制的变量来处理其中的潜在输入。
我首先生成一些随机数据,称为datos
:
c1=rnorm(98,47,23)
c2=rnorm(98,56,13)
c3=rnorm(98,52,7)
fila1=as.matrix(t(c(-2,15,30)))
colnames(fila1)=c("c1","c2","c3")
fila2=as.matrix(t(c(-20,5,20)))
colnames(fila2)=c("c1","c2","c3")
datos=rbind(data.frame(c1,c2,c3),fila1,fila2)
rm(c1,c2,c3,fila1,fila2)
然后,我计算稍后要绘制的变量,其中包括datos
均值 (puntoMedio
)、第一和第三四分位数 (cuar1
,cuar3
),内四分位数范围(iqr
),潜在次平均晶须的下限(limInf
),潜在超均值胡须的上限(limSup
)和离群值(次均值离群值vAtInf
和超级平均异常值vAtSup
合并在vAt
):
puntoMedio=apply(datos,MARGIN=2,FUN=mean)
cuar1=apply(datos,MARGIN=2,FUN=quantile,probs=.25)
cuar3=apply(datos,MARGIN=2,FUN=quantile,probs=.75)
cuar=rbind(cuar1,cuar3)
iqr=apply(cuar,MARGIN=2,FUN=diff)
cuar=rbind(cuar,iqr,puntoMedio)
limInf=array(dim=ncol(datos))
for(i in 1:ncol(datos)){
limInf0=as.matrix(t(cuar[1,]-1.5*cuar[3,]))
if(length(datos[datos[,i]<limInf0[,i],i])>0){
limInf[i]=limInf0[,i]
}else{limInf[i]=min(datos[,i])}
}
limSup=array(dim=ncol(datos))
for(i in 1:ncol(datos)){
limSup0=as.matrix(t(cuar[2,]+1.5*cuar[3,]))
if(length(datos[datos[,i]>limSup0[,i],i])>0){
limSup[i]=limSup0[,i]
}else{limSup[i]=max(datos[,i])}
}
d=data.frame(t(rbind(cuar,limInf,limSup)))
rm(cuar)
vAtInf=datos
for(i in 1:ncol(vAtInf)){
vAtInf[vAtInf[,i]>limInf0[,i],i]=NA
}
colnames(vAtInf)=c("vAtInfc1","vAtInfc2","vAtInfc3")
vAtSup=datos
for(i in 1:ncol(vAtSup)){
vAtSup[vAtSup[,i]<limSup0[,i],i]=NA
}
colnames(vAtSup)=c("vAtSupc1","vAtSupc2","vAtSupc3")
datos=cbind(datos,vAtInf,vAtSup)
rm(limInf0,limSup0,cuar1,cuar3,i,iqr,limInf,limSup,puntoMedio)
直到这里一切都按预期进行。我有两个数据框d
and datos
,前者在这里不感兴趣,后者在这种特定情况下包含九列:所有值中的三列、相应的次均值离群值中的三个和相应的超均值离群值中的三个(后六列用 NA 填充)。我现在希望按列提取所有异常值,因此我尝试制定以下循环。虽然它确实既不给出错误也不给出警告,但它也没有给出所需的输出vAt
(再次,逐列 [第 4:9 列] 异常值来自datos
)。那么,据我所知,问题发生在嵌套的 for 循环中,在尝试输入i
into vAt
:循环的每次迭代都会删除最后一次迭代,这样在整个循环完成后,vAt
仅包含 NA 和最后一列/最后一次迭代的异常值。
for(i in ((ncol(datos)/3)+1):ncol(datos)){
vAt=matrix(nrow=.25*nrow(datos),ncol=ncol(datos)-(ncol(datos)/3))
colnames(vAt)=c(((ncol(datos)/3)+1):ncol(datos))
if(length(datos[,i][is.na(datos[,i])==F])>0){
for(j in 1:(length(datos[,i][is.na(datos[,i])==F]))){
nom=as.character(i)
vAt[j,nom]=datos[,i][is.na(datos[,i])==F][j]
}
}else{next}
}
我没能找到任何现有线程 https://stackoverflow.com/questions/tagged/for-loop+indexing+r这回答了我的问题。谢谢你的帮助。