заменить NA в кадре данных случайными числами в диапазоне - PullRequest
3 голосов
/ 21 апреля 2019

У меня есть следующий фрейм данных с именем cars

Brand      year     mpg        reputation      Luxury
Honda      2010     30            8.5            0.5
Honda      2011     28            8.5            0.6
Dodge      2010     20            6.5            0.6
Dodge      2011     23            7.0            0.7
Mercedes   2010     22            9.5            NA
Mercedes   2011     25            9.0            NA

Я хочу заменить NA случайно сгенерированными действительными числами между 0.9 and 1.0

Я пытаюсь со следующим, ноон заменяет NA номером 0,9

cars[is.na(cars)] <-  sample(0.9:1, sum(is.na(cars)),replace=TRUE)

Таблица данных будет выглядеть примерно так:

Brand      year     mpg        reputation      Luxury
Honda      2010     30            8.5            0.5
Honda      2011     28            8.5            0.6
Dodge      2010     20            6.5            0.6
Dodge      2011     23            7.0            0.7
Mercedes   2010     22            9.5           *0.91*
Mercedes   2011     25            9.0           *0.97*

Код для структуры данных:

cars <- structure(list(Brand = c("Honda","Honda", "Dodge", "Dodge","Mercedes","Mercedes"), 
   year = c(2010L, 2011L,2010L, 2011L, 2010L, 2011L), 
   mpg = c(30L, 28L, 20L, 23L, 22L, 25L), reputation = c(8.5, 8.5, 6.5, 7L, 9.5, 9.5), Luxury = c(5L, 5.5, 6L, 6.5)), 
  class = "data.frame", row.names = c(NA, -4L))      

Ответы [ 2 ]

5 голосов
/ 21 апреля 2019

используйте runif вместо sample:

cars[is.na(cars)] <-  runif(sum(is.na(cars)), min = 0.9, max = 1)
4 голосов
/ 21 апреля 2019

Это потому, что 0.9:1 дает вам только одно число, которое составляет 0,9.Попробуйте,

0.9:1
#[1] 0.9

Следовательно, он заменяет эти числа на 0,9.

Допустим, вам нужна последовательность как

vals <- seq(0.9, 1, 0.01)
vals
#[1] 0.90 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.00

Теперь мы можем sampleв этой последовательности

df[is.na(df)] <- sample(vals, sum(is.na(df)), replace = TRUE)

df
#     Brand year mpg reputation Luxury
#1    Honda 2010  30        8.5   5.00
#2    Honda 2011  28        8.5   5.50
#3    Dodge 2010  20        6.5   6.00
#4    Dodge 2011  23        7.0   6.50
#5 Mercedes 2010  22        9.5   0.91
#6 Mercedes 2011  25        9.0   0.92

данные

df <- structure(list(Brand = structure(c(2L, 2L, 1L, 1L, 3L, 3L), 
.Label = c("Dodge", 
"Honda", "Mercedes"), class = "factor"), year = c(2010L, 2011L, 
2010L, 2011L, 2010L, 2011L), mpg = c(30L, 28L, 20L, 23L, 22L, 
25L), reputation = c(8.5, 8.5, 6.5, 7, 9.5, 9), Luxury = c(5, 
5.5, 6, 6.5, NA, NA)), class = "data.frame", row.names = c(NA, -6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...