首页 > 解决方案 > R 编码中的 if-else 语句不起作用

问题描述

我在 R 中进行了如下编码,

  data1<-c(25,35,60,79,50)
  data2<-c(100,150,170,200,1000)
  
  g1=sort(data1)
  g2=sort(data2)
  
  ybar1<-mean(g1)
  ybar2<-mean(g2)
  
  #BIWEIGHT
  
  med1=median(g1)
  med2=median(g2)
  
  mad1=1.4826*(median(abs(g1-med1)))
  mad2=1.4826*(median(abs(g2-med2)))

  u1=(g1-med1)/(9*mad1)
  u2=(g2-med2)/(9*mad2)
  
  #cat("\nu1:",u1)
  u=rbind(u1,u2)
  print(u)
  
  abs=abs(u)
  print(abs)
  
    for(j in abs){
      if(j < 1){
        num1 = ((g1-med1)^2)*((1-(u1^2))^4)
        den1 = ((1-(u1^2))*(1-5*(u1^2)))
        
        num2 = ((g2-med2)^2)*((1-(u2^2))^4)
        den2 = ((1-(u2^2))*(1-5*(u2^2)))
      }
    }
  
  cat("\num2:",num2)

但是当我手动计算时,对于data1,每个值u1都小于1,因此编码与我的手动计算是正确的,但是对于data2,它包括大于1的u2值。谁能帮我找出原因发生以及如何解决?先感谢您。

标签: rif-statement

解决方案


在我看来,问题在于在if条件内(因此也在for循环内),您总是采用整个向量(g1, g2, u1, u2)。您不会告诉 R只使用g1 和 g2 中 j<1 的那些值。相反,您使用整个向量的次数与其中abs<1的值一样多。

此外,您将u1and组合u2为一个 2 行矩阵,但将 g1 和 g2 分开。这很令人困惑,会给您带来更多问题。我建议你为这两个向量做单独的循环。

你可以这样做:

idx1 <- which(abs(u1) < 1) #Gives you the indexes/positions in vector u1, where abs(u1)<1 is TRUE
idx2 <- which(abs(u2) < 1) #same for u2

for(i in idx1){
               num1[i] = ((g1[i]-med1)^2)*((1-(u1[i]^2))^4)
               den1[i] = ((1-(u1[i]^2))*(1-5*(u1[i]^2)))
               }
for(j in idx2){
               num2[j] = ((g2[j]-med2)^2)*((1-(u2[j]^2))^4)
               den2[j] = ((1-(u2[j]^2))*(1-5*(u2[j]^2)))
               }

这样,num1并且den1有 5 个元素,因为 u1 的所有绝对值都 <1。
相反,num2并且den2有 4 个元素,因为 u2 的最后一个值是 ca。2.07。

希望这对您有所帮助。

编辑:忘记将索引 ( [i] and [j]) 添加到num1/2den1/ 2


推荐阅读