2012-10-22 58 views
1

我試圖通過矢量來找到使用IQR計算範圍的異常值。當我運行這個腳本尋找IQR右側的值時,我得到了結果,當我向左運行時,出現錯誤:缺少值,其中TRUE/FALSE所需。我怎樣才能清除數據集中的真假? 這裏是我的腳本:在[R]中出錯 - 需要TRUE/FALSE的缺失值

data = c(100, 120, 121, 123, 125, 124, 123, 123, 123, 124, 125, 167, 180, 123, 156) 
Q3 <- quantile(data, 0.75) ##gets the third quantile from the list of vectors 
Q1 <- quantile(data, 0.25) ## gets the first quantile from the list of vectors 
outliers_left <-(Q1-1.5*IQR(data)) 
outliers_right <-(Q3+1.5*IQR(data)) 
IQR <- IQR(data) 
paste("the innner quantile range is", IQR) 
Q1 # quantil at 0.25 
Q3 # quantile at 0.75 
# show the range of numbers we have 
paste("your range is", outliers_left, "through", outliers_right, "to determine outliers") 
# count ho many vectors there are and then we will pass this value into a loop to look for 
# anything above and below the Q1-Q3 values 
vectorCount <- sum(!is.na(data)) 
i <- 1 
while(i < vectorCount){ 
i <- i + 1 
x <- data[i] 
# if(x < outliers_left) {print(x)} # uncomment this to run and test for the left 
if(x > outliers_right) {print(x)} 
} 

,我得到的錯誤是

[1] 167 
[1] 180 
[1] 156 
Error in if (x > outliers_right) { : 
missing value where TRUE/FALSE needed 

,你可以看到,如果您運行此腳本,它被發現在右邊我的3個外行,也引發錯誤,但是當我在IQR的左邊再次運行這個函數,並且向量中出現了100個異常值時,我只是得到錯誤而沒有顯示其他結果。 我該如何修復這個腳本?任何幫助不勝感激。我一直在網上和我的書上搜索如何解決這個問題。

+1

'i = 16'發生錯誤。比較後切換'i <-i + 1'。 – liuminzhao

+0

您正在切換該語句的位置,以便在比較後發生。 –

+0

是的,謝謝,修好了! –

回答

3

正如評論中指出的那樣,錯誤是由於您構建while循環的方式。在最後一次迭代中,i == 16儘管只有15個元素需要處理。從i <= vectorCounti < vectorCount修復問題更改:

i <- 1 
while(i < vectorCount){ 
    i <- i + 1 
    x <- data[i] 
    # if(x < outliers_left) {print(x)} # uncomment this to run and test for the left 
    if(x > outliers_right) {print(x)} 
} 
#----- 
[1] 167 
[1] 180 
[1] 156 

然而,這實在是不屬於R是如何工作的,你很快就會在那個代碼需要多長時間爲任何明顯的大小的數據運行受挫。 R是「矢量化」,意思是你可以一次對data的所有15個元素進行操作。要打印的異常值,我應該這樣做:

data[data > outliers_right] 
#----- 
[1] 167 180 156 

或者使用OR運算符立刻讓所有的人:

data[data< outliers_left | data > outliers_right] 
#----- 
[1] 100 167 180 156 

對於一個小範圍內,上述邏輯比較創建布爾data的每個元素的值和R只返回那些是真的。您可以通過鍵入檢查自己這一點:

data > outliers_right 
#---- 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE TRUE 

[位實際上是一種提取操作,用於檢索數據對象的子集。請參閱幫助頁面獲取一些良好背景?"["

+0

我知道很多人認爲去除異常值是統計學上不好的做法,但在野外生物學領域,需要去除異常值才能更好地理解「大圖」 無論如何 - 我發現了一個更簡單的方法這而不是 data [data outliers_right] 我發現這是更有效的,它還允許我將值傳遞到其他函數,如直方圖和圖。 x [!x%in boxplot.stats(x)$ out] –

+0

@ JohnP.Newbury - 很酷,很好的調用直接調用'boxplot.stats'。如果你看看這個函數的源代碼,你會發現它基本上調用了我上面的答案。 – Chase

+0

@ JohnP.Newbury - 同樣,它的價值 - stackOverflow鼓勵您回答您自己的問題......並接受它,如果這是您的觀點中的「最佳答案」......評論可能會被刪除/刪除/或者人們可能會只是沒有像答案一樣閱讀它們。 – Chase

1

錯誤消息的出現是因爲你,你讓i <= vectorCount所以i可以等於vectorCount,從而從數據索引i = i+1會給NAif語句將失敗。

如果你想找到基於該IQR的波動,您可以使用findInterval

outliers <- data[findInterval(data, c(Q1,Q3)) != 1] 

我也將停止使用paste創建字符的信息是printed,使用message代替。

+0

謝謝,我是R新手,但對其他語言也很熟悉通過它的細微差別找到我的方式。 –