У меня ошибка в моем коде basi c R? пропущенное значение, где требуется ИСТИНА / ЛОЖЬ - PullRequest
1 голос
/ 10 апреля 2020

В основном я пытаюсь удалить некоторые элементы из моего вектора в R, но я продолжаю получать эту ошибку: отсутствует значение, где требуется TRUE / FALSE Вот код:

exA2b = function(x){
  m=mean(x)
  s=sd(x)
  print(x)
  for(i in 1:length(x))
  {
    if(x[i]<=m-2*s|x[i]>=m+2*s)
    {
      x=x[-i]
    }
  }
  print(x)
}
x=scan("test.txt")
exA2b(x)

и вот текстовый файл:

79 71 89 57 76 64 82 82 67 80 81 65 73 79 79
60 58 83 74 68 78 80 78 81 76 65 70 76 58 82
59 73 72 79 87 63 74 90 69 35 83 76 61 66 71
51 57 81 57 65 81 78 77 81 81 73 75 66 56 62
75 60 74 74 70 71 56 74 63 72 81 54 72 91 92

Полагаю, это что-то в отношении значений NA, но я не могу понять

Ответы [ 3 ]

0 голосов
/ 10 апреля 2020

Это должно сделать то, что вы пытаетесь сделать:

exA2B <- function(x){
  m=mean(x)
  s=sd(x)
  print(x)
  x[ifelse(x<=m-2*s|x>=m+2*s, FALSE, TRUE )]
 }

Ваша ошибка исходит от x = x [-i]. R не любит удалять из набора данных текущую итерацию, на которой вы находитесь.

Решение, которое я предоставляю, векторизует вашу проблему, поэтому оно работает быстрее и распечатывает старое и новое.

0 голосов
/ 10 апреля 2020

Да, это из-за NA с. Проблема в том, что вы делаете что-то length(x) раза, но вы удаляете некоторые элементы x в пути. Допустим, вы удалили 3 элемента по пути; Теперь за последние 3 итерации вы получите NA.

. Это будет делать то, что вы хотите:

exA2b = function(x){
  y = x
  m=mean(x)
  s=sd(x)
  print(x)
  x = x[!(x<=m-2*s | x>=m+2*s)]
  print(x)
}
exA2b(x)
0 голосов
/ 10 апреля 2020

Неважно, я решил проблему, добавив if (! Is.na (x [i])) перед первым условием if! Вот код на случай, если кто-то столкнется с той же проблемой:

exA2b = function(x){
  m=mean(x)
  s=sd(x)
  print(x)
  for(i in 1:length(x))
  {
    if(!is.na(x[i])){
    if(x[i]<=m-2*s|x[i]>=m+2*s)
    {
      x=x[-i]
    }
  }}
  print(x)
}
x=scan("test.txt")
exA2b(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...