Оператор If-else в кодировке R не сработал

#r #if-statement

#r #оператор if

Вопрос:

Я сделал кодирование в 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 оно включает значение u2, которое больше 1. кто-нибудь может помочь мне понять, почему это происходит и как это исправить?
заранее благодарю вас.

Комментарии:

1. Вы перезаписываете num2 в каждом цикле for цикла, поэтому значение num2 , которое вы печатаете, относится к конечному числу в abs

2. как я должен это исправить?

3. Объявляйте свои переменные как пустые векторы, выполняя num1 <- den1 <- num2 <- den2 <- c() перед циклом, а во время цикла do num1 = c(num1, (((g1-med1)^2)*((1-(u1^2))^4)) и так далее для каждой из 4 переменных (т. Е. Объединяйте результат цикла с векторами в каждом цикле)

4. для части if он по-прежнему считывает значение abs , которое больше 1, даже если условие if меньше 1 :((

Ответ №1:

Мне кажется, проблема в том, что внутри if условия (и, следовательно, также внутри for цикла) вы всегда берете целые векторы ( g1 , g2 , u1 , u2 ). Вы не указываете R использовать только те значения в g1 и g2, для которых j<1. Вместо этого вы используете весь вектор столько раз, сколько значений в abs нем <1.

Кроме того, вы объединяете u1 и 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 составляет около 2.07.

Надеюсь, это вам поможет.

РЕДАКТИРОВАТЬ: Забыл добавить индексы ( [i] and [j] ) в num1 / 2 и den1 / 2 .

Комментарии:

1. Большое вам спасибо за помощь, всю прошлую неделю я сталкивался с одним и тем же. Еще раз спасибо :))