簡體   English   中英

從R中重復的數據幀中刪除異常值

[英]removing outliers from repeated dataframe in 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

你可以試試這個:

#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] )。

這是使用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。 如果要更改異常值檢測規則,可以更改該值。

定義包裝器:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM