Заменить из NA на случайные значения

#r #dataframe #imputation

#r #фрейм данных #вменение

Вопрос:

Я хочу заменить с NA на случайные значения. В этом фрейме данных есть столбцы типа «Dayofweek», и я не знаю, как я могу завершить этот фрейм данных. Я пытаюсь с помощью функции missforest, но, я думаю, эта функция работает со столбцами с целым числом. Есть ли у вас какие-либо идеи, как я могу заполнить все столбцы?

 travel <- read.csv("https://openmv.net/file/travel-times.csv")

library(missForest)
summary(travel)

set.seed(82)
travel1 <- prodNA(travel, noNA = 0.2)
travel2 <- missForest(travel1)
 

Ответ №1:

Вы можете использовать пакет imputeTS для вставки случайных значений во временные ряды. Для na_random этого можно использовать функцию. Функция может использоваться для числовых столбцов (другие столбцы останутся нетронутыми, что может быть полезно, поскольку вам, вероятно, не нужны случайные тексты для столбца комментариев)

Вы можете вызвать

 library("imputeTS")
na_random(yourData)
 

и функция будет искать наименьшее и наибольшее значение каждого столбца и вставлять случайные значения между этими границами для вас.

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

 library("imputeTS")
na_random(yourData, lower_bound = 0, upper_bound = 25)
 

Для ваших данных это может выглядеть так:

 library("imputeTS")

# To read the input correctly and have the right data types
travel <- read.csv("https://openmv.net/file/travel-times.csv", na.strings = "")
travel$FuelEconomy <- as.numeric(travel$FuelEconomy)


# To perform the missing data replacement
travel <- na_random(travel)
 

Ответ №2:

Во-первых, если вы хотите читать "" строки как NA s, вам нужен дополнительный аргумент na.strings = "" in read.csv . Тогда вы имеете в виду замену наблюдения NA переменной другим случайным наблюдением той же переменной? Если это так, рассмотрите следующую процедуру:

 travel <- read.csv("https://openmv.net/file/travel-times.csv", na.strings = "")

set.seed(82)
res <- data.frame(lapply(travel, function(x) {
  is_na <- is.na(x)
  replace(x, is_na, sample(x[!is_na], sum(is_na), replace = TRUE))
}))
 

res выглядит так

          Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All                                      Comments
1    1/6/2012     16:37    Friday    Home    51.29    127.4     78.3           84.8         8.5      39.3       36.3         No                         Medium amount of rain
2    1/6/2012     08:20    Friday     GSK    51.63    130.3     81.8           88.9         8.5      37.9       34.9         No                             Put snow tires on
3    1/4/2012     16:17 Wednesday    Home    51.27    127.4     82.0           85.8         8.5      37.5       35.9         No                                    Heavy rain
4    1/4/2012     07:53 Wednesday     GSK    49.17    132.3     74.2           82.9        8.31      39.8       35.6         No                     Accident blocked 407 exit
5    1/3/2012     18:57   Tuesday    Home    51.15    136.2     83.4           88.1        9.08      36.8       34.8         No                              Rain, rain, rain
6    1/3/2012     07:57   Tuesday     GSK    51.80    135.8     84.5           88.8        8.37      36.8       35.0         No                           Backed up at Bronte
7    1/2/2012     17:31    Monday    Home    51.37    123.2     82.9           87.3           -      37.2       35.3         No Pumped tires up: check fuel economy improved?
8    1/2/2012     07:34    Monday     GSK    49.01    128.3     77.5           85.9           -      37.9       34.3         No Pumped tires up: check fuel economy improved?
9  12/23/2011     08:01    Friday     GSK    52.91    130.3     80.9           88.3        8.89      39.3       36.0         No                        Police slowdown on 403
10 12/22/2011     17:19  Thursday    Home    51.17    122.3     70.6           78.1        8.89      43.5       39.3         No                    Start early to run a batch