Search code examples
rmatrixcompareequals-operator

Comparing two values in R


I am checking the input of a matrix is reciprocal in R, i.e. value on one side is = to 1/value..

So far I have..

    AHP <- function(pairwisematrix){

    ## check the input data

    if (!((is.matrix(pairwisematrix) || (is.data.frame(pairwisematrix))))) 
            stop("pairwise matrix must be a matrix or a data frame")

    if (!(nrow(pairwisematrix) == ncol(pairwisematrix))) 
      stop("pairwise matrix must be a square matrix or a data frame")

    for (i in 1:nrow(pairwisematrix))   {
    for (j in 1:ncol(pairwisematrix))       {
        if (i == j) {   if (pairwisematrix[i,j] != 1)                                                                       {   stop("the central values in the reciprocal matrix must be 1.")                              }}
        else { if ((pairwisematrix[i,j] == 1 / pairwisematrix[j,i]) || (pairwisematrix[j,i] == 1 / pairwisematrix[i,j]))))  {   stop("the pairwise matrix must be reciprocal (i.e. value on one side must = 1/value)")     }}
                                            }
                                        }


  out <- "all worked"

    return(out)
}

but when I test:

check1 <- matrix(c(1,1/3,5,3,1,0.2,0.2,5,1),3,3,byrow=T)
test <- AHP(check1)

I get the error:

the pairwise matrix must be reciprocal (i.e. values on one side must = 1/value)0.333333 & 0.333333

I have tried converting the values to string, partial strings and tried identical(a,b,) with no success.

Does anyone have any ideas?


Solution

  • With many if s inside double for loops, I would be surprised if it works as intended. R is designed for working with matrix, so you could write something like

    AHP <- function(pairwisematrix){
      if(!all(pairwisematrix == t(1/pairwisematrix)))
        stop("the pairwise matrix must be reciprocal (i.e. value on one side must = 1/value)")
      else
        return("all worked")
    }
    
    AHP(check1)
    #[1] "all worked"