Допустим, у меня есть следующий пример данных:
set.seed(20130828)
data <- data.frame(X = c(NA, rnorm(1000), runif(20, -20, 20)),
Y = c(runif(1000),
rnorm(20, 2), NA), Z = c(rnorm(1000, 1), NA, runif(20)))
Используя следующую функцию, я определил выбросы, которые являются наблюдениями за пределами 3 sd:
findOutlier <- function(data, cutoff = 3) {
sds <- apply(data, 2, sd, na.rm = TRUE)
result <- mapply(function(d, s) {
which(d > cutoff * s)
}, data, sds)
result
}
outliers <- findOutlier(data)
Теперь мне нужно заменить все выбросы на NA. Я использовал следующую функцию:
OutliersToNA <- function(data, outliers) {
result <- mapply(function(d, o) {
res <- d
res[o] <- NA
return(res)
}, data, outliers)
return(as.data.frame(result))
}
Возвращает следующую ошибку:
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, :
arguments imply differing number of rows: 4, 0, 1, 2, 3
Можете ли вы предложить какие-либо улучшения в функции, чтобы заменить выбросы на NA?