簡體   English   中英

如何使用R從單個數據集中的多列中檢測和替換異常值?

[英]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)

我的問題是如何用另一個值(例如,均值、中值、上限值等)替換異常值? 任何幫助,將不勝感激!

您可以用您喜歡的meanmedian替換該值,而不是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.

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