добавьте точную пропорцию случайных пропущенных значений к данным.рамка
Я хотел бы добавить случайный NA
к данным.фрейм в R. до сих пор я рассматривал эти вопросы:
R: произвольно вставить NAs в кадр данных пропорционально
Как добавить случайные NA
s в кадр данных
Добавление случайных пропущенных значений в полный фрейм данных (в R)
Здесь было представлено много решений, но я не смог найти ни одного, которое соответствовало бы этим 5 условиям:
- добавьте действительно случайный NA, а не то же самое количество по строке или по столбцу
- работа с каждым классом переменных, которые можно встретить в данных.фрейм (числовой, символьный, факторный, логический, ТС..), поэтому выходные данные должны иметь тот же формат, что и входные данные.рамка или матрица.
- гарантировать точное число или пропорцию [Примечание] NA на выходе (многие решения приводят к меньшему числу NA, так как несколько генерируются в одном и том же месте)
- вычислительно эффективен для больших наборов данных.
- Добавить доля/число НС независимо от уже присутствующих на входной.
У кого-нибудь есть идея? Я уже пытался написать функцию для этого (в ответе первой ссылки), но она не соответствует пунктам N°3&4. Спасибо.
[Примечание] точная пропорция, округленная на + / - 1NA, конечно.
1 ответ:
Именно так я делаю это для своей статьи о
library(imputeMulti)
, которая в настоящее время находится на рассмотрении в JSS. Это вставляетNA
в случайный процент от всего набора данных и хорошо масштабирует, это не гарантируетточное число из-за случаяn * p * pctNA %% 1 != 0
.Очевидно, что для воспроизводимости следует использовать случайное начальное число, которое можно указать перед вызовом функции.createNAs <- function (x, pctNA = 0.1) { n <- nrow(x) p <- ncol(x) NAloc <- rep(FALSE, n * p) NAloc[sample.int(n * p, floor(n * p * pctNA))] <- TRUE x[matrix(NAloc, nrow = n, ncol = p)] <- NA return(x) }
Это работает как общая стратегия для создания базовых наборов данных для сравнения через вменение методы. Я думаю, что это то, чего вы хотите, хотя ваш вопрос (как отмечено в комментариях) не сформулирован четко.
Edit : я действительно предполагаю, что
x
является полным. Поэтому я не уверен, как он будет обрабатывать существующие недостающие данные. Конечно, вы можете изменить код, если хотите, хотя это, вероятно, увеличит время выполнения по крайней мере на O (n*p)