2014-01-12 46 views
1

我有一個很大的數據框。我想從箱形圖中推斷出我的數據框中每一列的異常值。這裏是一個可再現的示例 -使用R從數據幀的不同列中移除不同長度的異常值使用R

請3列+少數離羣

sample<-data.frame(a=c(444,2,3,4,-555), b=c(2,3,4,5,68), c=c(-100,8,9,10,11)) 
> sample 
    a b c 
1 444 2 -100 
2 2 3 8 
3 3 4 9 
4 4 5 10 
5 -555 68 11 

虛設數據幀通過省略離羣

sample<-lapply(1:length(sample), function(i) 
    subset(sample[[i]], sample[[i]]!=out[[i]])) 
定義離羣值對於每一列

out<-lapply(1:length(sample), function(i) sort(boxplot.stats(sample[[i]])$out)) 
> out 
[[1]] 
[1] -555 444 

[[2]] 
[1] 68 

[[3]] 
[1] -100 

子集數據

令人驚訝的是,它只在部分警告中起作用?!?

Warning message: 
In sample[[i]] != out[[i]] : 
    longer object length is not a multiple of shorter object length 

數據子集看起來像

> sample 
[[1]] 
[1] 444 2 3 4 

[[2]] 
[1] 2 3 4 5 

[[3]] 
[1] 8 9 10 11 

後對於列1,它僅-555除去,保持444 ??第2欄和第3欄工作得很好。警告信息清楚地說明了爲什麼會發生。通過從每個組中刪除一個異常值,它可能會保持類似的長度...

我的第二個方法是讓所有的異常值「NA」

sample<-lapply(1:length(sample), function(i) 
    sample[[i]][sample[[i]]==out[[i]]]<-NA) 

不工作!我怎麼解決這個問題?

回答

1

試試這個:

> lapply(1:length(sample), function(i) 
     subset(sample[[i]], !sample[[i]]%in%out[[i]])) 
[[1]] 
[1] 2 3 4 

[[2]] 
[1] 2 3 4 5 

[[3]] 
[1] 8 9 10 11 

注意,當你做sample[[i]]!=out[[i]])這是行不通的,因爲sample[[i]]是一個矢量,所以是out[[i]]。你真正想知道的是sample[[i]]的哪些元素不在out[[i]],所以你應該做!sample[[i]]%in%out[[i]]

爲了進一步澄清,你可以試試這個玩具的例子:

> c(444,2,3,4,-555) == c(-555, 444) 
[1] FALSE FALSE FALSE FALSE TRUE 
Warning message: 
In c(444, 2, 3, 4, -555) == c(-555, 444) : 
    longer object length is not a multiple of shorter object length 
> c(444,2,3,4,-555) %in% c(-555, 444) 
[1] TRUE FALSE FALSE FALSE TRUE 

==例子中,你在因爲recycling年底獲得TRUE。在內部,它實際上是比較這兩個向量c(444,2,3,4,-555) == c(-555, 444, -555, 444, -555),最後一個元素是相同的。

+0

感謝您的解釋! – ToNoY

相關問題