在r中按组计数异常值的数量,并在新数据帧中存储计数



我有一个有2列的数据集;列A是State_Name,具有5种不同的状态选项,列B是Total_Spend,具有该状态每天的平均总支出。每个州有365个观测值。

我想做的是使用1.5 IQR规则计算每个状态的异常值数量,并将每个状态的值保存到一个新的df或表中。

所以我希望输出类似于:

状态 Outlier计数
ATL 5
GA 20
MI 11
NY 50
TX 23

由于我不太熟悉函数boxplot.stats,所以我没有在解决方案中使用它,而是手动计算1.5*IQR+上分位数。

这里使用CCD_ 2作为示例。对于作为异常值的记录;标记";作为TRUE,其中我们可以将它们加在summarize中。

library(dplyr)
mtcars %>% 
group_by(cyl) %>% 
mutate(flag = disp >= (IQR(disp) * 1.5 + quantile(disp, probs = 0.75)), .keep = "used") %>% 
summarize(Outlier = sum(flag))
# A tibble: 3 × 2
cyl Outlier
<dbl>   <int>
1     4       0
2     6       1
3     8       0

由于我没有您的数据,我将用您提到的两列进行补充:

df<-data.frame(state=sample(c("ny","fl"),100, replace=TRUE),
spend=sample(1:100, 100, replace=TRUE))
> head(df)
state spend
1    ny     3
2    fl    87
3    ny    91
4    fl    97
5    ny    47
6    fl     8

然后设置你的上限和下限(可以是四分位数、绝对值,等等(

df%>%
group_by(state)%>%
mutate(lower_bound=quantile(spend,0.25),
upper_bound=quantile(spend,0.75))%>%
mutate(is_outlier=if_else(spend<lower_bound|spend>upper_bound,TRUE,FALSE))
# A tibble: 10 × 5
# Groups:   state [2]
state spend lower_bound upper_bound is_outlier
<chr> <int>       <dbl>       <dbl> <lgl>     
1 ny        3          38          84 TRUE      
2 fl       87          26          87 FALSE     
3 ny       91          38          84 TRUE      
4 fl       97          26          87 TRUE 

然后,如果您只想看到输出,请通过is_outlier:进行总结

df%>%
group_by(state)%>%
mutate(lower_bound=quantile(spend,0.25),upper_bound=quantile(spend,0.75))%>%
mutate(is_outlier=if_else(spend<lower_bound|spend>upper_bound,TRUE,FALSE))%>%
summarise(outliers=sum(is_outlier))
state         outliers
<chr>             <int>
1 fl                   19
2 ny                   30

最新更新