удаление выброса в r с учетом номинальной переменной - PullRequest
0 голосов
/ 28 мая 2018

Скажем, у меня есть три столбца

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 (номинальная), и мы должны удалить наблюдения, которые соответствуют выбросам переменных x и x1, в нашем случае это 1 и 8 наблюдений.из 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

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Если у вас есть кадр данных как

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)

Вы можете сделать это, чтобы удалить строки с выбросами в x или x1

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(`&`))
0 голосов
/ 28 мая 2018

Можно попробовать

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
0 голосов
/ 28 мая 2018

Попробуйте это решение:

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

Перед удалением значений в x и x1 необходимо сохранить позиции (x_to_remove и x1_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
...