繁体   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