如何有效地检查R中大向量的值?

时间:2010-07-01 18:58:53

标签: r

我想在R代码中一直做的一件事是测试某个向量是否适用某些条件,例如它是否包含任何或所有等于某个指定值的值。 R这样做的方法是创建一个布尔向量并使用任何或所有,例如:

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

对我来说,分配一个大向量并用值填充它似乎真的很低效,只是为了抛弃它(特别是如果any()all()调用只能在测试一对之后被短路有没有更好的方法来实现这一点,或者我是否应该在R工作时提交编写既高效又简洁的代码的愿望?

3 个答案:

答案 0 :(得分:3)

便宜,快速,可靠:挑选任何两个”是一种干涩的说法,有时你需要在构建或设计系统时订购优先级。

这里很相似:简洁表达式的成本是内存在幕后分配的事实。如果这确实是一个问题,那么你总是可以编写一个(编译的)例程来沿着向量运行(快速)并且一次只使用一对值。

可以权衡内存使用情况与性能与表现力的关系,但很难同时击中所有这三种情况。

答案 1 :(得分:0)

which(is.na(my_big_vector))
which(my_big_vector == 5)
which(my_big_vector < 3)

如果你想算数......

length(which(is.na(my_big_vector)))

答案 2 :(得分:0)

我认为这不是一个好主意 - R是一种非常高级的语言,所以你应该做的就是遵循标准。这样R开发人员就知道要优化什么。你还应该记住,虽然R是功能性和懒惰的语言,但它甚至可能像

这样的语句
any(is.na(a))

可以像

那样被识别和执行
.Internal(is_any_na,a)