【问题标题】:create an ID column with randomly generated values in R在 R 中使用随机生成的值创建一个 ID 列
【发布时间】:2020-02-20 18:28:29
【问题描述】:

我正在使用名为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. 为每个观察分配一个唯一的随机数

【问题讨论】:

    标签: r function


    【解决方案1】:

    当然有很多更简单的方法可以将随机值分配给ID 列。

    似乎 OP 只对 for 循环的解决方案感兴趣,那么这里有一些例子来实现它

    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) 
    }
    
    
    1. 为每个观察分配一个唯一随机数
    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
    }
    

    【讨论】:

    • 感谢@ThomasIsCoding。为什么我需要直接使用 seq(nrow(mtcars)) 而不是 mtcars?
    • @Danka 如果你使用for (i in mtcars) ...i 指的是mtcars 中的元素,即mtcars 的列,它们是列表,而不是行号。
    【解决方案2】:

    您可以对数据集中的行数使用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)
    

    关于 OP 对 for 循环的尝试。 NULL 删除列,而NANA 对其进行初始化。由于mtcars 中不存在列,因此会导致错误。循环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 我们可以有相同的数字。

    【讨论】:

    • 好的,谢谢。但我仍然想知道如何以每行都有不同数字的方式编写函数?
    • @Danka 如果您尝试上述方法,每一行都会有不同的数字。
    • 是的,结果是一样的(而且你得到它的方式更好)但我想学习如何编写函数
    • 我不清楚您在寻找什么,但您可以将相同的东西包装到一个函数中并将其用于不同的数据集。我已经更新了答案。
    • 我想知道为什么使用 mtcars$ID[i] 会出错,以及如何更改我的函数,以便为每一行得到不同的数字
    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2020-11-19
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多