我已经找到了一些与我正在寻找的答案相似的答案,但是代码没有用。
我需要用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, .))