[英]How to detect and replace outlier from multiple columns in a single data set using R?
我正在嘗試從多個數字列中查找和替換異常值。 以我的拙見,這不是最佳實踐,但這是我試圖針對特定用例找出的方法。 可以在此處找到創建附加列的一個很好的示例,該列將行標記為異常值,但它基於單個列。
我的數據如下(為簡單起見,我排除了包含因子的列):
Row ID Value1 Value2
1 6 1
2 2 200
3 100 3
4 1 4
5 250 5
6 2 6
7 8 300
8 600 300
9 2 9
我使用一個函數在所有數字列中用 NA 替換異常值:
replaceOuts = function(df) {
map_if(df, is.numeric,
~ replace(.x, .x %in% boxplot.stats(.x)$out, NA)) %>%
bind_cols
}
test = replaceOuts(df)
我的問題是如何用另一個值(例如,均值、中值、上限值等)替換異常值? 任何幫助,將不勝感激!
您可以用您喜歡的mean
或median
替換該值,而不是NA
。
library(dplyr)
library(purrr)
replaceOuts = function(df) {
map_if(df, is.numeric,
~ replace(.x, .x %in% boxplot.stats(.x)$out, mean(.x))) %>%
bind_cols
}
replaceOuts(df)
# RowID Value1 Value2
# <dbl> <dbl> <dbl>
#1 1 6 1
#2 2 2 200
#3 3 100 3
#4 4 1 4
#5 5 108. 5
#6 6 2 6
#7 7 8 300
#8 8 108. 300
#9 9 2 9
將mean
替換為您想要的任何其他函數的median
。
PS - 我認為最好在這里使用mutate_if
而不是map_if
,因為它最終避免了bind_cols
。
df %>% mutate_if(is.numeric, ~replace(., . %in% boxplot.stats(.)$out, mean(.)))
我認為您需要 minVal 和 maxMax 閾值。 然后用 myValue 中的任何值替換超出范圍(minVal、maxVal)的值(平均值、中位數或您需要的值)
# Could be any value for limits, i.e.
minVal <- boxplot.stats(data$columnX)$stats[1]
maxVal <- boxplot.stats(data$columnX)$stats[5]
myValue <- median(data$columnX)
data[data$columnX < minVal | data$columnX > maxVal, "columnX"] <- myValue
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.