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