R语言 删除不同组的离群值[已关闭]

new9mtju  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(248)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

三年前关闭了。
Improve this question
我是新来的,所以请对我宽容点:-)
我正在寻找一个解决方案,以删除在同一列中相差特定值的离群值:
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),]

但是,尝试这种方法会删除所有年龄段的所有值,即使它们只是一个年龄段的离群值

kr98yfug

kr98yfug1#

这真的取决于你如何定义“离群值”。但是如果你愿意接受离群值是四分位距加或减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 ... Other args passed to `quantile()`
#'
#' @export
replace_outliers <- function(x, ...) {
  qnt <- quantile(x, probs = c(.25, .75), ...)
  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))

相关问题