R 删除不同组的异常值

R 删除不同组的异常值,r,outliers,R,Outliers,我是新来的,所以请宽容我:-) 我正在寻找一种解决方案,以消除在同一列中不同于某个值的异常值: 体重年龄 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_ma

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

我正在寻找一种解决方案,以消除在同一列中不同于某个值的异常值:


体重年龄
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),]

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

异常值这实际上取决于如何定义“异常值”。但是如果你愿意接受的话 异常值是任何值加上或减去四分位数范围的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
}

请原谅格式化…这是我的线程编辑您的问题,以添加所用语言的标记(我觉得它像R,但我也不确定您的问题,它可能是另一种语言,可以制作类似的图形)-这将有助于确保可以帮助查看您的问题的人。您如何定义异常值?从统计学上讲。根据问题的不同,有几种方法可以定义异常值。谢谢Giovanni。这是我一直在寻找的解决方案。我只想谈谈你和als akash87提到的问题:这是我的数据集的异常值的正确定义吗。。
library(dplyr)

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