通过均值标准偏差查找异常值,用大数据集(6000多个列)中的NA替换]]

问题描述 投票:0回答:1

我已经找到了一些与我正在寻找的答案相似的答案,但是代码没有用。

我需要用NA或NULL替换每列的所有离群值(为达到我们的目的定义为离均值超过2 SD)。我试图在所有列上进行迭代,计算每列的离群值并替换那些值。

披露:我也从统计学上知道对于消除异常值有很强的见解,并且考虑到在这种情况下计算出的SD包含异常值,因此使用SD作为排除它们的措施。这些是我从我们的统计学家那里得到的指示,所以我现在正在解决这个问题。

这是我的数据集的一瞥:

data

Group sp.Q13813.SPTN1_HUMAN sp.O14773.TPP1_HUMAN sp.P11137.MTAP2_HUMAN
1 Premutation           10713983468            367492324            2134747097
2 Premutation           10789498495            343303410            2677825476
3 Premutation           11134883489            383589325            2132552280
4 Premutation            9723552595            269965000            2262740921
5 Premutation           11175156282            359864993            1419225650
6 Premutation           10959077349            258095035            3343267633
7 Premutation           10770809133            331554977            2763604046
8 Premutation           11098182537            344384433            2198718886

我已经尝试了包含scale()函数的代码,但是当我执行以下函数时,我发现它替换了列均值2 SD之内的值,并且将代码保留为缩放格式。我不太熟悉此功能,并且不确定如何将其还原为原始数据点,即使它正在替换正确的异常值也是如此。

方法尝试#1

# take note of order for column names
data.names_P <- colnames(data)


# scale all numeric columns
data.numeric.Pre <- select_if(data, is.numeric) %>% # subset of numeric columns
  mutate_all(scale)                             # perform scale separately for each column
data.numeric.Pre[data.numeric.Pre > 2] <- 99999 # set values larger than 2 to NA (none in this example)

# combine results with subset data frame of non-numeric columns
data.Pre <- data.frame(select_if(data, function(x) !is.numeric(x)),
                   data.numeric)

# restore columns to original order
data.Pre <- data.Pre[, data.names_P]

方法尝试#2


FindOutliers <- function(data) {
  upper = (2*sd(data) + mean(data)
  lower = (mean - 2*sd(data))
  result <- which(data < upper | data > lower)
}

我知道第二次尝试不会将数据替换为NA。

任何帮助将不胜感激。

我已经找到了一些与我正在寻找的答案相似的答案,但是代码没有用。我需要替换所有......>

r replace outliers stdev
1个回答
0
投票

您可以使用ifelse函数,这里是使用dplyr并将ifelse函数应用于包含术语HUMAN的所有列的示例:

library(dplyr)
data %>% mutate_at(.vars = vars(contains("HUMAN")), 
                   .funs= ~ifelse(abs(.)>mean(.)+2*sd(.), NA, .))
© www.soinside.com 2019 - 2024. All rights reserved.