Удаление выбросов разной длины из разных столбцов фрейма данных с помощью 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)

Не работает !! Как я могу решить эту проблему?


person ToNoY    schedule 12.01.2014    source источник


Ответы (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

В примере == вы получаете TRUE в конце из-за переработка. Внутри он фактически сравнивает эти два вектора c(444,2,3,4,-555) == c(-555, 444, -555, 444, -555), и последний элемент такой же.

person Julián Urbano    schedule 12.01.2014