2010-07-01 52 views
3

我一直想在R代碼中做的一件事是測試某個矢量的某些條件是否成立,例如它是否包含任何或所有等於某個指定值的值。該R十歲上下的方式做,這是創建一個布爾向量和使用任何或所有,例如:如何有效地檢查R中大向量的值?

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

似乎真的效率低下給我分配一個大的載體,其值填充它,只是把它扔(特別是在any()all()all()呼叫可以在測試一些值後短路。是否有更好的方法來做到這一點,或者我應該只是交出我希望編寫的代碼在工作時既高效又簡潔在R

回答

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

如果你想數它們...

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

執行這不是因爲is.na很好的答案產生bool矢量... – mbq 2010-07-01 19:29:19

3

便宜,快速,可靠:挑選任意兩個」是說,你有時需要訂購你的重點建設或設計系統時的乾燥方式。

它在這裏非常相似:簡潔表達的代價是內存被分配到幕後的事實。如果這確實是一個問題,那麼你總是可以編寫一個(編譯?)例程來沿矢量運行(快速),並且一次只使用一對值。

可以權衡內存使用率與性能與表現力,但很難同時擊中所有三個。

+0

看起來內置的庫應該具有可以告訴你大矢量中的任何值是NA還是等於某個值的函數。在Python中,可以使用生成器綜合,它將分配固定數量的內存,並將任何()或所有()的計算短路。 – Nick 2010-07-08 00:36:21

0

我認爲這不是一個好主意--R是一種非常高級的語言,所以你應該做的是遵循標準。這樣R開發人員知道要優化什麼。你還應該記住的是,雖然R是功能和懶惰的語言,它甚至有可能像聲明

any(is.na(a)) 

可以被識別和類似

.Internal(is_any_na,a)