Я хочу, чтобы намеренно сделать 5%, 10% значений в кадре данных, которые должны быть заменены NA, чтобы моделировать случайные пропущенные данные - PullRequest
0 голосов
/ 09 июля 2019

У меня есть полные данные за 4 года за месяц. Я хочу нарочно сделать 5%, 10%, 20%, 30% и 40% значений в кадре данных для замены NA, чтобы имитировать случайные пропущенные данные. Как я могу сделать это в R или Excel?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Если вы хотите ввести NA не только в одном столбце, но и во всем data.frame (даже в столбцах идентификатора / ключа), тогда будет работать следующий подход.

Давайте возьмем пример данных изпервый ответ и добавьте еще один столбец «Давление».

library(dplyr)
library(purrr)
set.seed(1001) 


raindata <- data.frame(Year  = rep(2000:2003, each = 12),
                       Month = rep(month.name, 4),
                       Rain  = sample(0:100, 48, replace = TRUE),
                       Pressure = sample(900:1100, 48, replace = TRUE),
                       stringsAsFactors = FALSE)

Теперь вы можете создать data.frame с заданным процентом ИСТИНА / ЛОЖЬ, а на следующем шаге вы можете перебрать столбцы с помощью if_else.заявление о замене FALSE на NA.

na_df <- matrix(data = sample(c(TRUE, FALSE),
                              size = length(as.matrix(raindata)),
                              replace = TRUE,
                              prob = c(0.9,0.1)), # Here you can adjust the probability
                nrow = nrow(raindata),
                ncol = ncol(raindata),
                dimnames = list(rownames(raindata),
                                colnames(raindata))) %>% as.data.frame()

map2_df(raindata, na_df, function(x,y) ifelse(y == TRUE, x, NA))
0 голосов
/ 09 июля 2019

Мы обычно запрашиваем некоторые примеры данных и указание того, какие подходы вы уже использовали. Но для начала, вот один из подходов, использующий dplyr.

Давайте сделаем несколько поддельных данных за 4 года, 12 месяцев в году и 1 наблюдение в месяц, итого 48 строк:

set.seed(1001) # for reproducibility
raindata <- data.frame(Year  = rep(2000:2003, each = 12),
                       Month = rep(month.name, 4),
                       Rain  = sample(0:100, 48, replace = TRUE),
                       stringsAsFactors = FALSE)

dplyr имеет функцию sample_frac(), которая будет отбирать заданную долю строк. Например, для выборки 95% из них:

library(dplyr)
raindata %>%
  sample_frac(0.95)

Затем вы можете inner_join отобранных строк к исходным данным - но объединить только по году и месяцу. Это даст вам два столбца Rain: Rain.y (оригинал) и Rain.x, содержащие 5% значений NA, поскольку были сопоставлены только Year и Month, а не Rain:

raindata_new <- raindata %>% 
  sample_frac(0.95) %>%
  right_join(raindata, 
             by = c("Year", "Month"))

Для 10%, 20%, 30% и 40% просто замените значение в sample_frac() на 0,9, 0,8, 0,7 и 0,6 соответственно.

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