2016-09-23 31 views
1

我試圖將數據點設置在上/下位數+/- 3 * IQR之外的數據點爲NA。我遇到的挑戰是如何通過一組數據來做到這一點。如何將函數「by」的布爾輸出與輸入矢量匹配

作爲示例,下面的數據集具有分隔列和值列。對於每個分割,我需要計算值列的上限和下限分位數和IQR,然後將滿足上述條件的值列中的數據點設置爲NA。

x <- structure(list(Split = c(1L, 1L, 3L, 2L, 2L, 2L, 2L, 1L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 3L, 1L, 3L, 2L, 3L), Value = c(0.9, 0.9, 3.5, 2.2, 2.2, 2.2, 2.2, 0.9, 3.5, 3.5, 3.5, 1.1, 3.5, 0.9, 1.9, 3.4, 0.9, 3.5, 2.2, 3.5)), .Names = c("Split", "Value"), class = "data.frame", row.names = c(NA, -20L)) 

我曾用「由」功能,以確定需要被設定爲NA的值:

out <- by(
    x$Value, 
    x$Split, 
    function(y) 
    y < (quantile(y, probs=c(.25, .75), na.rm = T)[1] - 3*IQR(y, na.rm = T)) | 
    y > (quantile(y, probs=c(.25, .75), na.rm = T)[2] + 3*IQR(y, na.rm = T))) 

的I中使用的輸出用「不公開」,設置數據點NA :

x$Value[unlist(out)] <- NA 

這是行不通的。原因是「by」輸出與x $ Value列之間的不同排序。

任何有關如何匹配兩個輸出並將相應值設置爲NA的建議?

感謝。

回答

1

可以使用unsplit代替unlistby扭轉分裂:

x$Value[unsplit(out, x$Split)] <- NA 
## Split Value 
##1  1 0.9 
##2  1 0.9 
##3  3 3.5 
##4  2 2.2 
##5  2 2.2 
##6  2 2.2 
##7  2 2.2 
##8  1 0.9 
##9  3 3.5 
##10  3 3.5 
##11  3 3.5 
##12  3 NA 
##13  3 3.5 
##14  1 0.9 
##15  1 NA 
##16  3 NA 
##17  1 0.9 
##18  3 3.5 
##19  2 2.2 
##20  3 3.5 

再次,使用x$Split作爲求出的分割的因素。