【问题标题】:How to remove subjects with outliers in multiple+ columns in R如何删除R中多个+列中具有异常值的主题
【发布时间】:2022-10-23 14:26:47
【问题描述】:
Group ExamScore1 ExamScore2 ExamScore3 ExamScore4
A 68 84 19 95
B 68 83 28 92
B 68 92 38 83
C 78 84 38 94
C 94 85 28 82
C 94 92 38 38
B 48 83 83 38
B 38 19 48 29
C 29 23 91 12
A 48 34 92 39
A 95 58 93 48

上面是一个数据框,df源自更大的数据框 x,其中学生被分成 A、B 或 C 组并进行四次考试。 我想做以下事情:

确定哪个学生在 A 组、B 组和 C 组中分别有异常值测试分数(使用四分位距法)(我已经为此编写了代码)。

df1 <- df %>%
group_by(x.Group) %>%
filter(!x.score %in% boxplot.stats(x.score)$out) %>%
ungroup()

然后,我想删除在2个或更多的考试.例如,如果 A 组中的一名学生在 ExamScore1 和 ExamScore3 中的得分异常,则该学生将从数据框中删除。

删除所有异常值后,我希望将数据放入一个新的数据框中df2

关于如何解决这个问题的任何想法?先感谢您

【问题讨论】:

  • boxplot.stats 是什么?另请提供可复制的表格或您的数据,而不是屏幕截图。如果您希望人们更快地帮助您,请运行 dput(df) 并将其粘贴到您的问题中。

标签: r


【解决方案1】:

这是一种方法。获取每次考试每组的异常值数量,与原始数据集绑定并按异常值计数进行过滤。最后,从结果df1 中删除异常值列。

df<-'Group  ExamScore1  ExamScore2  ExamScore3  ExamScore4
A   68  84  19  95
B   68  83  28  92
B   68  92  38  83
C   78  84  38  94
C   94  85  28  82
C   94  92  38  38
B   48  83  83  38
B   38  19  48  29
C   29  23  91  12
A   48  34  92  39
A   95  58  93  48'
df <- read.table(textConnection(df), header = TRUE)

suppressPackageStartupMessages(
  library(dplyr)
)

df1 <- bind_cols(
  df,
  df %>%
    group_by(Group) %>%
    mutate(across(starts_with("ExamScore"), (x) x %in% boxplot.stats(x)$out)) %>%
    ungroup() %>%
    rowwise() %>%
    mutate(outliers = sum(c_across(cols = starts_with("ExamScore")))) %>%
    select(outliers) 
) %>%
  filter(outliers < 2)

df1
#>    Group ExamScore1 ExamScore2 ExamScore3 ExamScore4 outliers
#> 1      A         68         84         19         95        0
#> 2      B         68         83         28         92        0
#> 3      B         68         92         38         83        0
#> 4      C         78         84         38         94        0
#> 5      C         94         85         28         82        0
#> 6      C         94         92         38         38        0
#> 7      B         48         83         83         38        0
#> 8      B         38         19         48         29        0
#> 9      C         29         23         91         12        0
#> 10     A         48         34         92         39        0
#> 11     A         95         58         93         48        0

df1 <- df1 %>% select(-outliers)

创建于 2022 年 10 月 23 日,reprex v2.0.2

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 2012-08-11
    • 2013-05-07
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2021-01-12
    相关资源
    最近更新 更多