首页 > 解决方案 > 为什么此代码从 data.frame 更改为 matrix 不适用于模式“qn”?

问题描述

实际上,对于其他模式,x=as.matrix(x) 运行良好,但对于 mode="qn",它不起作用并触发了错误。像这样 :

mm.norm(iris[1:4],"qn") 

apply(x, 2, rank, ti​​es.method = "first") 中的错误:dim(X) 必须具有正长度

iris 是数据框

代码是

function(x, mode, na.rm=FALSE){
if(class(x)=="data.frame"){
    x = as.matrix(x)
} 
if(class(x)=="matrix"){
    return (apply(x,2,mm.norm, mode=mode, na.rm=na.rm))
}
if (mode =="uv"){
    x = x/sd(x, na.rm=na.rm)
}
else if (mode =="fs"){
    x = ((x-min(x)/max(x)-min(x)))
}
else if (mode =="qn"){
    x.rank= apply(x,2, rank, ties.method="first")
    x.sort=apply(x,2, sort)
    x.mean= apply(x.sort,1,mean)
    itm<-function(x.rank,x.mean){
        return(x.mean[x.rank])
    }
    x=apply(x.rank,2,itm,x.mean)
}
else if (mode =="z"){
    x = (x-mean(x))/sd(x, na.rm=na.rm)
}
else{stop(paste("unknow mode", mode))}
return(x)
}

标签: rmatrix

解决方案


我认为这里有错误:

if(class(x)=="matrix"){
    return (apply(x,2,mm.norm, mode=mode, na.rm=na.rm))
}

老实说,我不知道为什么这部分代码在这里,也许你可以把它去掉。第一个 if 语句检查输入(矩阵:是/否)。第二个运行函数递归,但我不明白为什么。

但是,我很好奇:你的模式fs:你确定吗,它是

((x-min(x)/max(x)-min(x)))

我不知道你应该做什么,但我会期待

(x-min(x)) / (max(x) - min(x))

推荐阅读