Нахождение «какого числа нет» в числовой последовательности c в R - PullRequest
1 голос
/ 29 января 2020

При попытке исключить указанные c числа из последовательности я заметил, что which(!(0:10 %in% 2:3)) возвращает другой результат (удаляет 3 и 4 и добавляет 11), чем setdiff(0:10,2:3) или which(!(1:10 %in% 2:3)).

which(!(1:10 %in% 2:3))
[1]  1  4  5  6  7  8  9 10
which(!(0:10 %in% 2:3))
[1]  1  2  5  6  7  8  9 10 11
setdiff(0:10,2:3)
[1]  0  1  4  5  6  7  8  9 10

Кажется, это простая проблема логики c, но я не могу понять, с чем это связано? setdiff так же быстро, как which(!()) для больших последовательностей?

1 Ответ

1 голос
/ 21 апреля 2020

Обобщая комментарии, which дает положение элементов, а не самих элементов, приведенный выше пример неясен, но эти примеры делают это очевидным:

which(!(10:20 %in% 12:13))
[1]  1  2  5  6  7  8  9 10 11

0:10 %in% 2:3
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

Таким образом, правильный способ выбора элементы будут:

myseq<-0:10
myseq[which(!(0:10 %in% 2:3))]

Что касается скорости, выбор элементов непосредственно из вектора немного быстрее:

myseq<-0:1000000
> microbenchmark::microbenchmark(
+   wh=myseq[which(!(0:1000000 %in% 2:3))],
+   sd=setdiff(0:1000000,2:3),
+   seq=(0:1000000)[!0:1000000 %in% 2:3]
+ )
Unit: milliseconds
 expr      min       lq     mean   median       uq      max neval cld
   wh 18.62157 18.85489 25.17644 25.37830 26.89162 152.9487   100  a 
   sd 36.09655 42.83383 50.22088 44.16595 45.96227 178.2949   100   b
  seq 17.51332 17.98346 25.00993 24.39265 25.91137 174.1875   100  a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...