Почему этот код для перехода от data.frame к матрице не работает для режима "qn"? - PullRequest
0 голосов
/ 27 апреля 2020

На самом деле, для других режимов x = as.matrix (x) работает хорошо, но для режима = "qn" он не работает и выдает ошибку. например:

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

Ошибка в применении (x, 2, rank, ties.method = "first"): dim (X) должен иметь положительную длину

ирис - это датафрейм

, а код

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)
}

1 Ответ

0 голосов
/ 27 апреля 2020

Я думаю, что здесь есть ошибка:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...