【问题标题】:deleting outlier in r with account of nominal var使用名义变量删除 r 中的异常值
【发布时间】:2018-11-07 05:18:29
【问题描述】:

说,我有三列

x <- c(-10, 1:6, 50)
x1<- c(-20, 1:6, 60)
z<- c(1,2,3,4,5,6,7,8)

检查 x 的异常值

bx <- boxplot(x)
bx$out

检查 x1 的异常值

bx1 <- boxplot(x1)
bx1$out

现在我们必须删除异常值

x <- x[!(x %in% bx$out)]
x

x1 <- x1[!(x1 %in% bx1$out)]
x1

但是我们有变量 Z(nominal),我们必须删除对应于变量 x 和 x1 的异常值的观察值, 在我们的例子中,它是 1 和 8 obs。的Z

怎么做? 在输出中我们必须有

x   x1  z
Na  Na  Na
1   1   2
2   2   3
3   3   4
4   4   5
5   5   6
6   6   7
Na  Na  Na

【问题讨论】:

  • 嗨,您正在使用我的解决方案,我可以在这里看到:stackoverflow.com/questions/50584209/… 欢迎接受答案!另一个问题见。
  • @Terru_theTerror,是的,你是对的,我们如何确定不同长度的问题。你能用不同的长度来解决你的解决方案吗?
  • 我正在尝试在另一个主题上帮助您。如果此问题已解决,请关闭它并接受答案。
  • @Terru_theTerror,我接受了你的回答,但现在我编辑了新帖子。可以查一下吗?

标签: r dataframe dplyr mean outliers


【解决方案1】:

你可以试试

z[!((x1 %in% bx1$out) | (x %in% bx$out))]

tidyverse

library(tidyverse)
data.frame(x, x1, z) %>% 
  select(starts_with("x")) %>%  
  map_dfr(~.x %in% boxplot(.x, plot = F)$out) %>%  
  with(.,!rowSums(.)) %>% 
  filter(df, .)
   x x1 z
1 50  1 2
2  1  2 3
3  2  3 4
4  3  4 5
5  4  5 6
6  5  6 7

【讨论】:

    【解决方案2】:

    如果你有一个数据框

    x  <- c(-10, 1:6, 50)
    x1 <- c(-20, 1:6, 60)
    z  <- c(1,2,3,4,5,6,7,8)
    df <- data.frame(x = x, x1 = x1, z = z)
    

    您可以这样做以删除 xx1 中具有异常值的行

    is.outlier <- sapply(df[c('x', 'x1')], function(x) x %in% boxplot(x)$out)
    df[!rowSums(is.outlier),]
    
    #   x x1 z
    # 2 1  1 2
    # 3 2  2 3
    # 4 3  3 4
    # 5 4  4 5
    # 6 5  5 6
    # 7 6  6 7
    

    tidyverse(结果相同)

    library(tidyverse)
    df %>% 
      filter(map(list(x, x1), ~!.x %in% boxplot(.x)$out) %>% pmap_lgl(`&`))
    

    【讨论】:

      【解决方案3】:

      试试这个解决方案:

      x_to_remove<-which(x %in% bx$out)
      x <- x[!(x %in% bx$out)]
      
      x1_to_remove<-which(x1 %in% bx1$out)
      x1 <- x1[!(x1 %in% bx1$out)]
      
      z<-z[-unique(c(x_to_remove,x1_to_remove))]
      z    
      [1] 2 3 4 5 6 7
      

      在删除xx1 中的值之前,您必须保存位置(x_to_removex1_to_remove),然后用于清理z

      你的输出:

      data.frame(cbind(x,x1,z))
        x x1 z
      1 1  1 2
      2 2  2 3
      3 3  3 4
      4 4  4 5
      5 5  5 6
      6 6  6 7
      

      【讨论】:

        猜你喜欢
        • 2012-08-11
        • 2021-12-26
        • 1970-01-01
        • 2017-09-25
        • 2018-12-16
        • 2018-10-03
        • 2019-04-11
        • 1970-01-01
        相关资源
        最近更新 更多