случайно выбрать значения, которые не являются NA в R - PullRequest
0 голосов
/ 30 ноября 2011

Как случайным образом заменить 15% значений, которые не являются NA в кадре данных, значениями NA? Мне нужно знать, какие значения были заменены. Позиции должны быть сохранены в другой матрице логических значений.

Сложность для меня - заменить только среди значений, которые еще не являются NA.

РЕДАКТИРОВАТЬ: Вот образец:

NA 1 2 3 4
4 3 6 8 2
3 8 3 NA 7

Я хочу заменить 15% значений, которые не являются NA (15% от 13, т.е. 1 значение).

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Я бы преобразовал data.frame в матрицу (чтобы иметь доступ к значениям в виде вектора), нашел бы 15% значений и присвоил бы им значение NA.Я позволю вам отработать хранение замененных позиций в качестве упражнения.:)

del <- data.frame(w = runif(25), x = runif(25), y = runif(25), z = runif(25))
del <- as.matrix(del)
get.sample.index <- sample.int(n = length(del), size = 0.15 * length(del))
extract.del.vals <- del[get.sample.index] # these are the values that will be NA
del[get.sample.index] <- NA # assign those values NA
del <- as.data.frame(del)

Поскольку у нас уже есть data.frame с NA, давайте выберем только значения, которые не являются NA.Вам нужно будет решить, какие 15% вы хотите отобрать, включая NA или исключая.

# addendum
del <- as.matrix(del)
which.are.na <- which(is.na(del) == TRUE)
sample.index <- 1:length(del)
sample.index <- sample.index[-which.are.na] #exclude those that are NA
get.sample.index2 <- sample(x = sample.index, size = 0.15 * length(sample.index))
del[get.sample.index2] <- NA
del <- as.data.frame(del)
1 голос
/ 30 ноября 2011

Поскольку предоставленные данные выборки были слишком малы, чтобы увидеть, что происходит, вот лучший набор:

n_data <- 200
some_data <- matrix(runif(200), nrow = 20)
some_data[sample(n_data, 100)] <- NA
some_data

Метод Романа в порядке, так что это просто более чистая итерация кода.

number_of_nas <- sum(is.na(some_data))
fifteen_pct_of_nas <- 0.15 * number_of_nas
na_positions <- which(is.na(some_data))
indicies_to_replace <- sample(na_positions, fifteen_pct_of_nas)
some_data[indicies_to_replace] <- 999

Если вы предпочитаете указание значений замены в матричной форме, используйте arrayInd.

arrayInd(indicies_to_replace, dim(some_data))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...