【问题标题】:Comparing two values in R比较 R 中的两个值
【发布时间】:2014-12-17 14:18:24
【问题描述】:

我正在检查矩阵的输入在 R 中是倒数的,即一侧的值是 = 到 1/值..

到目前为止我有..

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

但是当我测试时:

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

我得到错误:

成对矩阵必须是倒数(即一侧的值必须 = 1/值)0.333333 & 0.333333

我尝试将值转换为字符串、部分字符串并尝试相同(a,b,)但没有成功。

有人有什么想法吗?

【问题讨论】:

  • 我很难理解互惠。它被埋在许多ifs 之下。对于check1,您希望得到什么样的结果? all worked?

标签: r matrix compare equals-operator


【解决方案1】:

在双 for loops 中有许多 if s,如果它按预期工作,我会感到惊讶。 R 是为处理矩阵而设计的,所以你可以写类似

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"

【讨论】:

  • 不错的答案(尤其是删除循环)!我建议进行两个小修改:在前两种情况下使用stop 而不是return,并使用if (!all(diag(matrix) == 1)){...} 之类的东西来检查对角线。 (+1)
  • 感谢您的建议。 if (!all(diag(matrix) == 1)){...} 聪明多了。我将它们反映在我的回答中。
  • 看到你的更新 - 非常好。 diag 的另一个选择当然是if (any(diag(matrix) != 1)){...},但两者都应该没问题。或者..你也可以使用stopifnot :)
  • 我发现对角线检查是多余的,因为a==t(1/a) 排除了diag!=1
  • 太棒了,非常感谢您的帮助!我认为它需要一些时间来适应使用 c# :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多