我有一个有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