从R中重复的数据帧中删除异常值

时间:2018-01-11 16:41:31

标签: r

我想从数据帧中删除每个组(通过每个BRMA_Name)的异常值(从异常值中删除行)。我的示例数据如下:

BRMA_No BRMA_Name   Price
1   A   5
1   A   6
1   A   100
1   A   90
2   B   50
2   B   60
2   B   40
2   B   400
2   B   4
3   C   4
3   C   2

我仔细观察但找不到任何答案(抱歉),任何人都可以对此有所了解。

亲切的问候 Lutfor

3 个答案:

答案 0 :(得分:2)

你可以试试这个:

#outlier based on IQR - returns TRUE or FALSE based on the outlier condition
outlier <- function(x) {
  ifelse(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x), 
         TRUE, 
         FALSE)
}

library(data.table)
#apply the function per group
setDT(df)[, out := outlier(Price), by = 'BRMA_Name']
df
# BRMA_No BRMA_Name Price   out
# 1:       1         A     5 FALSE
# 2:       1         A     6 FALSE
# 3:       1         A   100 FALSE
# 4:       1         A    90 FALSE
# 5:       2         B    50 FALSE
# 6:       2         B    60 FALSE
# 7:       2         B    40 FALSE
# 8:       2         B   400  TRUE
# 9:       2         B     4  TRUE
#10:       3         C     4 FALSE
#11:       3         C     2 FALSE

然后只需选择out为FALSE的行(例如df[out == FALSE])。

答案 1 :(得分:1)

以下是使用boxplot确定异常值的选项:

library(data.table)
setDT(mydf)[, rm := !Price %in% boxplot(Price, plot = FALSE)$out, BRMA_Name][(rm)]
#    BRMA_No BRMA_Name Price   rm
# 1:       1         A     5 TRUE
# 2:       1         A     6 TRUE
# 3:       1         A   100 TRUE
# 4:       1         A    90 TRUE
# 5:       2         B    50 TRUE
# 6:       2         B    60 TRUE
# 7:       2         B    40 TRUE
# 8:       3         C     4 TRUE
# 9:       3         C     2 TRUE

我认为更合适的方法是:

setDT(mydf)[, rm := !Price %in% boxplot.stats(Price)$out, BRMA_Name][(rm)]

boxplot.stats的帮助页面中,coef参数的函数默认值为1.5。如果您想更改离群值检测规则,可以更改该值。

答案 2 :(得分:0)

定义包装器:

TukeyRangeFilter <- function(x) {
  normrange <- quantile(x, c(0.25, 0.75)) + c(-1.5, 1.5) * IQR(x)
  findInterval(x, normrange)==1
}

然后使用by

遍历BRMA的元素
by(df, df$BRMA_Name, function(x) x[TukeyRangeFilter(x$Price), ])

do.call(rbind, <output>)连接。

     BRMA_No BRMA_Name Price
A.1        1         A     5
A.2        1         A     6
A.3        1         A   100
A.4        1         A    90
B.5        2         B    50
B.6        2         B    60
B.7        2         B    40
C.10       3         C     4
C.11       3         C     2