【问题标题】:Removing outliers of different lengths from different columns of a dataframe using R使用 R 从数据帧的不同列中删除不同长度的异常值
【发布时间】:2014-01-12 02:43:39
【问题描述】:

我有一个大数据框。我想从箱形图中推断出的数据框的每一列中删除异常值。这是一个可重现的示例-

制作一个 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)

没有用!!我该如何解决这个问题?

【问题讨论】:

    标签: r na outliers


    【解决方案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
    

    == 示例中,由于recycling,您会在末尾得到一个TRUE。内部其实是比较这两个向量c(444,2,3,4,-555) == c(-555, 444, -555, 444, -555),最后一个元素是一样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-18
      • 2016-11-03
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 2018-03-23
      相关资源
      最近更新 更多