簡體   English   中英

使用R從數據幀的不同列中刪除不同長度的異常值

[英]Removing outliers of different lengths from different columns of a dataframe using 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

定義每列的離群值

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

[[2]]
[1] 68

[[3]]
[1] -100

通過忽略異常值對數據進行分組

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

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

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)

不行!! 我怎么解決這個問題?

嘗試這個:

> 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

==示例中,由於回收 ,最后得到TRUE 在內部,實際上是在比較這兩個向量c(444,2,3,4,-555) == c(-555, 444, -555, 444, -555) ,最后一個元素是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM