【问题标题】:Remove outliers for different groups [closed]删除不同组的异常值[关闭]
【发布时间】:2019-12-12 20:00:59
【问题描述】:

我是全新的,所以请对我宽容:-)

我正在寻找一种解决方案来删除同一列中的某个值不同的异常值:

body_mass age 1 19 11 2 20 10 3 26 8 4 21 6 5 18 12 6 18 7 7 30 11 8 17 8 9 17 10 10 18 8

boxplot(body_mass~age, data = df, subset=age %in% c(0:22))$out
outliers <- boxplot(body_mass~age, data = df, subset=age %in% c(0:22))$out

df[which(df$body_mass %in% outliers),]
df <- df[-which(df$body_mass %in% outliers),]

但是尝试这种方式,会删除所有年龄的所有值,即使它们只是一个年龄类别的异常值

【问题讨论】:

  • 请原谅格式化...这是我的主题
  • 编辑您的问题以添加所用语言的标签(对我来说,它看起来像 R,但我不确定您的问题,它可能是另一种制作类似外观图形的语言) - 这个将有助于确保可以帮助查看您的问题的人。
  • 您将什么定义为异常值?从统计学上讲。有几种方法可以根据问题定义异常值。

标签: r outliers


【解决方案1】:

这实际上取决于您如何定义“异常值”。但如果你愿意接受 异常值是四分位距的正负 1.5 倍的任何值,那么您可以使用以下方法按年龄组去除体重中的异常值。

另外,我假设您想将每个年龄视为一个单独的组,因为您没有另外说明。

定义一个函数,将异常值替换为NA

#' Replace outliers
#'
#' Replace outliers with NA. Outliers are defined as values that fall outside plus or minus
#' 1.5 * IQR.
#'
#' @return Numeric vector of same length.
#' @param x Numeric vector to replace.
#' @param na.rm Should NA values be replaced beforehand?
#'
#' @export
remove_outliers <- function(x, na.rm = TRUE, ...) {
  qnt <- quantile(x, probs = c(.25, .75), na.rm = na.rm, ...)
  val <- 1.5 * IQR(x, na.rm = na.rm)
  y <- x
  y[x < (qnt[1] - val)] <- NA
  y[x > (qnt[2] + val)] <- NA
  y
}

按年龄组申请remove_outliers()并过滤。

library(dplyr)

df2 <- df %>% 
  group_by(age) %>% 
  mutate(body_mass = replace_outliers(body_mass)) %>% 
  ungroup() %>% 
  filter(!is.na(body_mass))

【讨论】:

  • 谢谢乔瓦尼。那是我一直在寻找的解决方案。我只是对您和其他 akash87 提到的内容做的很浅薄:这是对我的数据集异常值的正确定义吗..
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2018-10-10
  • 2018-10-03
相关资源
最近更新 更多