Как вы можете эффективно проверить значения больших векторов в R? - PullRequest
3 голосов
/ 01 июля 2010

Одна вещь, которую я хочу делать все время в своем R-коде, это проверить, выполняются ли определенные условия для вектора, например, содержит ли он какие-либо или все значения, равные некоторому указанному значению.R простой способ сделать это - создать логический вектор и использовать любой или все, например:

any(is.na(my_big_vector))
all(my_big_vector == my_big_vector[[1]])
...

Мне кажется неэффективным выделять большой вектор и заполнять его значениями,просто отбросить его (особенно, если вызов any() или all() может быть замкнут накоротко после тестирования только нескольких значений. Есть ли лучший способ сделать это, или я должен просто передать свое желание написать кодчто эффективно и кратко при работе в R?

Ответы [ 3 ]

3 голосов
/ 01 июля 2010

" Дешево, быстро, надежно: выбирайте любые два " - это сухой способ сказать, что вам иногда нужно упорядочивать свои приоритеты при создании или проектировании систем.

Это довольно похожездесь: стоимость краткого выражения заключается в том, что память выделяется за кулисами.Если это действительно проблема, то вы всегда можете написать (скомпилированные?) Подпрограммы для выполнения (быстро) вдоль векторов и использования только пары значений за раз.

Вы можете соотносить использование памяти с производительностью и выразительностью, но трудно достичь всех трех одновременно.

0 голосов
/ 01 июля 2010

Я думаю, что это не очень хорошая идея - R - язык очень высокого уровня, поэтому вам следует следовать стандартам.Таким образом, разработчики R знают, что оптимизировать.Вы также должны помнить, что хотя R является функциональным и ленивым языком, даже возможно, что оператор, такой как

any(is.na(a))

, может быть распознан и выполнен как что-то вроде

.Internal(is_any_na,a)
0 голосов
/ 01 июля 2010
which(is.na(my_big_vector))
which(my_big_vector == 5)
which(my_big_vector < 3)

А если вы хотите их посчитать ...

length(which(is.na(my_big_vector)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...