我有一个大数据框。我想从箱形图中推断出的数据框的每一列中删除异常值。这是一个可重现的示例-
制作一个包含 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)
不行!!我怎么解决这个问题?