我想在R代码中一直做的一件事是测试某个向量是否适用某些条件,例如它是否包含任何或所有等于某个指定值的值。 R
这样做的方法是创建一个布尔向量并使用任何或所有,例如:
any(is.na(my_big_vector))
all(my_big_vector == my_big_vector[[1]])
...
对我来说,分配一个大向量并用值填充它似乎真的很低效,只是为了抛弃它(特别是如果any()
或all()
调用只能在测试一对之后被短路有没有更好的方法来实现这一点,或者我是否应该在R
工作时提交编写既高效又简洁的代码的愿望?
答案 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)