создать столбец идентификаторов со случайно сгенерированными значениями в R - PullRequest
0 голосов
/ 20 февраля 2020

Я использую пакет под названием mtcars и хочу получить случайно сгенерированное число для каждого наблюдения. Я написал небольшую функцию

mtcars$ID <- NULL
for (i in mtcars){
  mtcars$ID <- runif(1, min=0, max=100)
}

, но это число одинаково для всех автомобилей.

Я пытался

mtcars$ID <- NULL
for (i in mtcars){
  mtcars$ID[i] <- runif(1, min=0, max=100)
}

, что приводит к ошибке. Я хотел бы получить два типа результатов (две функции):

  1. , чтобы назначить случайное число каждому наблюдению
  2. , чтобы присвоить уникальное случайное число каждому наблюдению

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Конечно, существует множество более простых способов присвоить случайные значения столбцу ID.

Кажется, что OP интересуется только решениями с for l oop, тогда вот несколько примеров

  1. чтобы назначить случайное число каждому наблюдению:
for (i in seq(nrow(mtcars))){
  mtcars$ID[i] <- runif(1, min=0, max=100) # assign random value which might be duplicated (but with low probability if you don't have super many rows) 
}

для присвоения уникального случайного числа каждому наблюдению
for (i in seq(nrow(mtcars))){
  repeat {
    r <- runif(1, min=0, max=100)
    if (!r %in% mtcars$ID) break # if generated random number is not in the existing values, then terminate the loop and go to value assignment in the next step
  }
  mtcars$ID[i] <- r
}
0 голосов
/ 20 февраля 2020

Вы можете использовать sample для количества строк в наборе данных.

mtcars$ID <- sample(nrow(mtcars))

Диапазон для этого будет от 1 до количества строк в данных, и он будет произвольно назначен для каждой строки.

При необходимости он также может быть заключен в функцию:

get_a_unique_id <- function(data) sample(nrow(data))

mtcars$ID <- get_a_unique_id(mtcars)
iris$ID <- get_a_unique_id(iris)

Относительно попытки ОП на for l oop. NULL удаляет столбец, тогда как NA инициализирует его с NA. Так как в mtcars столбец отсутствует, это приводит к ошибке. Также l oop for (i in mtcars){ перебирает значения столбцов, а не строк. Попробуйте

 for (i in mtcars){
    print(i)
 }

Следовательно, оно должно быть

mtcars$ID <- NA 
for (i in seq_len(nrow(mtcars))){
   mtcars$ID[i] <- runif(1, min=0, max=100)
}

Однако даже это не гарантирует 100% наличия уникального значения для каждой строки, так как с runif мы можем иметь то же самое номера.

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