繁体   English   中英

在 R 中使用随机生成的值创建一个 ID 列

[英]create an ID column with randomly generated values in R

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

当然有很多更简单的方法可以将随机值分配给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
}

您可以对数据集中的行数使用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我们可以有相同的数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM