[英]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.