r语言 - 通过平均值的标准偏差查找异常值,在大型数据集(6000+ 列)中替换为 NA



我找到了一些与我正在寻找的答案相似的答案,但代码不起作用。

我需要用 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 替换数据。

任何帮助将不胜感激。

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

library(dplyr)
data %>% mutate_at(.vars = vars(contains("HUMAN")), 
.funs= ~ifelse(abs(.)>mean(.)+2*sd(.), NA, .))

我们可以使用您第二次尝试中的函数将数据替换为NA

FindOutliers <- function(data) {
mean_data <- mean(data, na.rm = TRUE)
sd_data <- sd(data, na.rm = TRUE)
upper = 2*sd_data + mean_data
lower = mean_data - 2*sd_data
replace(data, data > upper | data < lower, NA)
}
library(dplyr)
data %>%  mutate_if(is.numeric, FindOutliers)
#Tested it via
#mtcars %>%  mutate_if(is.numeric, FindOutliers)

相关内容

  • 没有找到相关文章

最新更新