Замена значений выбросов в R

Мне нужен способ заменить выбросы значением -9999. По моим данным -9999 означает, что значение отсутствует. Это просто соглашение, обычно используемое для этого типа данных вместо NA.

У меня есть фрейм данных под названием amf, состоящий из 43 столбцов. Мне нужно идти столбец за столбцом и заменять каждое значение выше 99-го процентиля и ниже 1-го процентиля на -9999. Некоторые столбцы мне нужно пропустить, например столбец дня года.

Я пробовал использовать функции apply и lapply по-разному, но, должно быть, использую их неправильно. Вот что я пробовал

amf_out <- apply(amf[,4:43],2, which(amf[,4:43] > quantile(amf[,4:43, .99)))

amf_out <- lapply(1:length(amf), function(i) amf[which(amf[,i] > quantile(amf[,1],.99))] <- 
-9999)

amf[which(amf[,4:43] > quantile(amf[,4:43], .99))] <- -9999

Ни один из тезисов не сработал. Какие-либо предложения?


person user2113499    schedule 07.02.2014    source источник
comment
Что вы оправдываете для этого? В зависимости от ваших настроек / данных это может быть очень неэтично.   -  person rawr    schedule 07.02.2014
comment
Я согласен с rawr. Если вы хотите удалить выбросы, вам следует по крайней мере использовать надлежащий тест на выбросы. Однако делать этого совсем не стоит.   -  person Roland    schedule 07.02.2014
comment
Это данные с метеорологических приборов. Иногда прибор может работать со сбоями и записывать значения, выходящие за пределы допустимого диапазона, например, 1000 ° C для температуры. Любые значения, которые явно неприемлемы, должны быть установлены на одно значение, которое обозначено как пропущенное значение.   -  person user2113499    schedule 07.02.2014
comment
Но тогда вам не следует делать это на основе квантилей, а следует определять диапазон температур, который возможен с метеорологической точки зрения.   -  person Roland    schedule 07.02.2014
comment
Какая функция лучше для удаления крайних значений?   -  person user2113499    schedule 07.02.2014


Ответы (3)


Когда вы работаете в R, используйте NA для пропущенных значений. Все остальное создаст головную боль при кодировании и станет источником ошибок. Вы должны использовать другое пропущенное значение только при экспорте данных для использования с другим программным обеспечением, которое требует такого другого значения. write.table (и его варианты, такие как write.csv) имеют аргумент na, который позволяет вам указать это значение.

write.csv(amf_out, "my file", na = "-9999")
person Richie Cotton    schedule 07.02.2014

Не говоря уже о том, следует ли вам это делать или нет, вот еще одна альтернатива:

threshold <- 1000
as.data.frame(lapply(amf_out, function(x) replace(x, x > threshold, -9999)))

Здесь вы переходите столбец за столбцом и заменяете значения, превышающие ваш порог. Предположительно, вам нужен одинаковый порог для всех значений. Это может быть 1000, или квантиль, или что-то еще.

person BrodieG    schedule 07.02.2014

Чтобы получить выходной файл data.frame, вы можете использовать следующее:

amf_out <- apply(amf[,4:43],2, function(x) {x[x > quantile(x, .99) & x < quantile(x, .01)] <- -9999;x})

person harkmug    schedule 07.02.2014