首页 > 解决方案 > R:识别异常值并在箱线图中标记它们

问题描述

我有以下虚假数据代表在线问卷中不同用户的回答时间(以秒为单位):

n <- 1000

dat <- data.frame(user = 1:n, 
                  question = sample(paste("q", 1:10, sep = ""), size = 10, replace = TRUE),
                  time = round(rnorm(n, mean = 10, sd=4), 0)
                  )
dat %>%
  ggplot(aes(x = question, y = time)) + 
  geom_boxplot(fill = 'orange') +
  ggtitle("Answering time per question")

然后,我将每个问题的回答时间绘制为箱线图。但是我如何首先计算一个带有二进制变量的列,显示一个案例是否是异常值[定义为中位数(时间)+/- 3 * mad(时间)]在每个问题中

标签: rdplyrtidyverse

解决方案


library(dplyr)
dat %>%
  group_by(question) %>%
  mutate(outlier = abs(time - median(time)) > 3*mad(time) ) %>%
  ungroup() %>%
  
  ggplot(aes(x = question, y = time)) + 
  geom_boxplot(fill = 'orange') +
  
  geom_point(data = . %>% filter(outlier), color = "red") +
  ggtitle("Answering time per question")

通过在每个问题中进行第一次分组,计算适用于与该问题相比的中位数和疯狂的每一行。

在此处输入图像描述


推荐阅读