R未正确识别等式

R未正确识别等式,r,R,我试图根据哪一行的值最高来对矩阵进行分类。我的代码工作正常,除非第一行和第三行的值相同,否则输出结果是第三行的值大于第一行的值。 例如,当我使用以下矩阵时: , , 1 [,1] [,2] [,3] [1,] 0.5+0i 0.5+0i 0.5+0i [2,] 0.0+0i 0.0+0i 0.0+0i [3,] 0.5+0i 0.5+0i 0.5+0i 以及以下代码位: null <- 0 neg

我试图根据哪一行的值最高来对矩阵进行分类。我的代码工作正常,除非第一行和第三行的值相同,否则输出结果是第三行的值大于第一行的值。 例如,当我使用以下矩阵时:

        , , 1

           [,1]   [,2]   [,3]
    [1,] 0.5+0i 0.5+0i 0.5+0i
    [2,] 0.0+0i 0.0+0i 0.0+0i
    [3,] 0.5+0i 0.5+0i 0.5+0i 
以及以下代码位:

  null   <- 0
  neg   <- 0
  pos   <- 0
  equal <- 0

  for(i in 1){
   if(Re(pie.ch[1,1,i])>Re(pie.ch[2,1,i]) &&
      Re(pie.ch[1,1,i])>Re(pie.ch[3,1,i])){
         neg<-neg+1
    }
    if(Re(pie.ch[3,1,i])>Re(pie.ch[1,1,i]) &&
       Re(pie.ch[3,1,i])>Re(pie.ch[2,1,i])){
          pos<-pos+1
    }


  if(Re(pie.ch[2,1,i])>Re(pie.ch[1,1,i]) &&
  Re(pie.ch[2,1,i])>Re(pie.ch[3,1,i])){
      null<-null+1
  }
  if((Re(pie.ch[1,1,i])==Re(pie.ch[2,1,i]) && 
    Re(pie.ch[1,1,i])>Re(pie.ch[3,1,i]))||
    (Re(pie.ch[1,1,i])==Re(pie.ch[3,1,i])&&
    Re(pie.ch[1,1,i])>Re(pie.ch[2,1,i])||
  (Re(pie.ch[2,1,i])==Re(pie.ch[3,1,1])&&
  Re(pie.ch[3,1,i])>Re(pie.ch[1,1,i]))|| 
  Re(pie.ch[1,1,i])==Re(pie.ch[2,1,i]) &&
  Re(pie.ch[2,1,i])==Re(pie.ch[3,1,i]))){
     equal<-equal+1

 }
}
    null
    neg
    pos
    equal
但是,如果这三个值都相同,那么代码就可以正常工作。我尝试将所有值都设置为0,为Equal设置1,为Pos设置0


你知道为什么会发生这种错误吗?多谢各位

如果没有对象的dput,很难说您的问题可能是什么,但以下是当平等的逻辑测试无法满足我的期望时,我通常会寻找的

(x <- 0.5+0i + 1e-8)
# [1] 0.5+0i
Re(x) == 0.5
# [1] FALSE
但事实上,你的问题是不可复制的。使用表示的数据生成数组并运行代码,执行后pos为0,equal为1

pos <- 0
equal <- 0
pie.ch <- array(0, dim = c(3, 3, 3))
pie.ch[,,1] <- matrix(rep(c(0.5+0i, 0+0i, 0.5+0i), 3), 3)
pie.ch

# , , 1

#        [,1]   [,2]   [,3]
# [1,] 0.5+0i 0.5+0i 0.5+0i
# [2,] 0.0+0i 0.0+0i 0.0+0i
# [3,] 0.5+0i 0.5+0i 0.5+0i

...
i <- 1
if(Re(pie.ch[3,1,i])>Re(pie.ch[1,1,i])&&Re(pie.ch[3,1,i])>Re(pie.ch[2,1,i])){pos<-pos+1}
if((Re(pie.ch[1,1,i])==Re(pie.ch[2,1,i])&&Re(pie.ch[1,1,i])>Re(pie.ch[3,1,i]))||(Re(pie.ch[1,1,i])==Re(pie.ch[3,1,i])&&Re(pie.ch[1,1,i])>Re(pie.ch[2,1,i])||(Re(pie.ch[2,1,i])==Re(pie.ch[3,1,1])&&Re(pie.ch[3,1,i])>Re(pie.ch[1,1,i]))||Re(pie.ch[1,1,i])==Re(pie.ch[2,1,i])&&Re(pie.ch[2,1,i])==Re(pie.ch[3,1,i]))){equal<-equal+1}
pos
# [1] 0
equal
# [1] 1

如果我理解正确,您也可以根据位置匹配这些值?所以如果第一列的值是max,你会认为它是负数,第三列的值是正数,依此类推?Zdravo.:我不确定我是否完全理解你的意思。基本上,这些矩阵表示马尔可夫链的平稳状态,因此第一行的值是人口负增长率的概率,第三行是正增长率,中间一行是0。Živjo:formatpie.ch[1,1,1],digits=16是什么?formatpie.ch[3,1,1],digits=16如何?请在代码中使用换行符、空格和更清晰的格式以使其可读。然后您必须给我们一种创建数组的方法。你能用dputpie.ch的输出编辑这个问题吗?或者如果问题太大,有一个子集可以重现这个问题吗?
(x <- 0.5+0i + .Machine$double.eps)
format(x, digits = 16)
# [1] "0.5000000000000002+0i"
pos <- 0
equal <- 0
pie.ch <- array(0, dim = c(3, 3, 3))
pie.ch[,,1] <- matrix(rep(c(0.5+0i, 0+0i, 0.5+0i), 3), 3)
pie.ch

# , , 1

#        [,1]   [,2]   [,3]
# [1,] 0.5+0i 0.5+0i 0.5+0i
# [2,] 0.0+0i 0.0+0i 0.0+0i
# [3,] 0.5+0i 0.5+0i 0.5+0i

...
i <- 1
if(Re(pie.ch[3,1,i])>Re(pie.ch[1,1,i])&&Re(pie.ch[3,1,i])>Re(pie.ch[2,1,i])){pos<-pos+1}
if((Re(pie.ch[1,1,i])==Re(pie.ch[2,1,i])&&Re(pie.ch[1,1,i])>Re(pie.ch[3,1,i]))||(Re(pie.ch[1,1,i])==Re(pie.ch[3,1,i])&&Re(pie.ch[1,1,i])>Re(pie.ch[2,1,i])||(Re(pie.ch[2,1,i])==Re(pie.ch[3,1,1])&&Re(pie.ch[3,1,i])>Re(pie.ch[1,1,i]))||Re(pie.ch[1,1,i])==Re(pie.ch[2,1,i])&&Re(pie.ch[2,1,i])==Re(pie.ch[3,1,i]))){equal<-equal+1}
pos
# [1] 0
equal
# [1] 1