Функция для удаления выбросов по группе из фрейма данных - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь удалить выбросы из моего информационного кадра, содержащего x и y переменные, сгруппированные по переменной cond.

Я создал функцию для удаления выбросов на основе статистики по коробочному графику и возврата df без выбросов.Функция работает хорошо, когда применяется для необработанных данных.Однако, если применить к сгруппированным данным, функция не работает, и я получил ошибку:

Error in mutate_impl(.data, dots) : 
  Evaluation error: argument "df" is missing, with no default.

Пожалуйста, как я могу исправить мою функцию, чтобы в качестве аргументов были взяты векторы df$x и df$y,и правильно ли избавляться от выбросов по группам?

enter image description here


Мои фиктивные данные:

set.seed(955)
# Make some noisily increasing data
dat <- data.frame(cond = rep(c("A", "B"), each = 22),
                  xvar = c(1:10+rnorm(20,sd=3), 40, 10, 11:20+rnorm(20,sd=3), 85, 115),
                  yvar = c(1:10+rnorm(20,sd=3), 200, 60, 11:20+rnorm(20,sd=3), 35, 200))


removeOutliers<-function(df, ...) {

  # first, identify the outliers and store them in a vector
  outliers.x<-boxplot.stats(df$x)$out
  outliers.y<-boxplot.stats(df$y)$out

  # remove the outliers from the original data
  df<-df[-which(df$x %in% outliers.x),]
  df[-which(df$y %in% outliers.y),]
}

# REmove outliers (try if function works)
removeOutliers(dat)

# Apply the function to group
# Not working!!!

dat_noOutliers<- dat %>%
  group_by(cond) %>%
  mutate(removeOutliers)

Iнашли эту функцию для удаления выбросов из векторных данных.Однако я хотел бы удалить выбросы из векторов df$x и df$y в кадре данных.

remove_outliers <- function(x, na.rm = TRUE, ...) {
  qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
  H <- 1.5 * IQR(x, na.rm = na.rm)
  y <- x
  y[x < (qnt[1] - H)] <- NA
  y[x > (qnt[2] + H)] <- NA
  y
}

( удалить выбросы по группе в R )

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы можете просто отфильтровать свои данные:

library(tidyverse)

set.seed(955)
dat <- data.frame(cond = rep(c("A", "B"), each = 22),
                  xvar = c(1:10+rnorm(20,sd=3), 40, 10, 11:20+rnorm(20,sd=3), 85, 115),
                  yvar = c(1:10+rnorm(20,sd=3), 200, 60, 11:20+rnorm(20,sd=3), 35, 200))

dat %>%
  ggplot(aes(x = xvar, y = yvar)) + 
  geom_point() + 
  geom_smooth(method = lm) +
  ggthemes::theme_hc()

dat %>%
  group_by(cond) %>%
  filter(!xvar %in% boxplot.stats(xvar)$out) %>%
  filter(!yvar %in% boxplot.stats(yvar)$out) %>%
  ggplot(aes(x = xvar, y = yvar)) + 
  geom_point() + 
  geom_smooth(method = lm) +
  ggthemes::theme_hc()

Создано в 2018-12-11 представлением пакета (v0.2.1)

0 голосов
/ 11 декабря 2018

Поскольку вы применяете эту функцию ко всему df, вы должны вместо этого использовать mutate_all.Do:

dat_noOutliers<- dat %>%
  group_by(cond) %>%
  mutate_all(remove_outliers)
...