У меня есть небольшая проблема в функции. Целью этого является удаление выбросов, которые я обнаружил в своем data.frame. Они обнаруживаются, когда есть слишком большая разница с предыдущим правильным значением (например, c(1,2,3,20,30,4,5,6)
: "20" и "30" являются выбросами). Но мои данные намного сложнее, чем это.
Моя идея состоит в том, чтобы считать первые два числовых значения моего столбца «правильными». Затем я хочу проверить каждое следующее значение:
- если разница между тестируемым значением и предыдущим составляет ‹20, то это новое правильное значение, и тест должен начинаться снова с этого нового правильного значения (а не с предыдущего правильного)
- если та же разница больше 20, то это неправильная. Индекс должен быть помещен рядом с неправильным значением, и тест должен продолжаться с того же правильного значения, пока не будет обнаружено новое правильное значение.
Вот пример с моей функцией и поддельным DF:
myts <- data.frame(x=c(12,12,35,39,46,45,33,5,26,28,29,34,15,15),z=NA)
test <- function(x){
st1 = NULL
temp <- st1[1] <- x[1]
st1 <- numeric(length(x))
for (i in 2:(length(x))){
if((!is.na(x[i])) & (!is.na(x[i-1]))& (abs((x[i])-(temp)) > 20)){
st1[i] <- 1
} }
return(st1)
}
myts[,2] <- apply(as.data.frame(myts[,1]),2,test)
myts[,2] <- as.numeric(myts[,2])
Он выполняет почти всю работу, но проблема в том, что последнее правильное значение не запоминается. Он по-прежнему выполняет тест с первого правильного значения. Из-за этого строки с 9 по 11 в моем примере не обнаруживаются. Я позволю вам представить проблему на 500 000 строк data.frame.
Как мне решить эту маленькую проблему? Остальные функции могут быть в порядке.