我有一个大型数据框。我想从箱图中推断出从我的数据帧的每一列中删除异常值。这是一个可重复的例子 -
创建一个包含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)
不起作用!!我该如何解决这个问题?
答案 0 :(得分: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
。
为了进一步澄清,您可以尝试这个玩具示例:
==
在TRUE
示例中,由于recycling,您最后得到c(444,2,3,4,-555) == c(-555, 444, -555, 444, -555)
。在内部,它实际上是比较这两个向量{{1}},最后一个元素是相同的。