使用相同数量的实例随机选择1到10之间的值

时间:2012-12-05 16:42:21

标签: r

  

可能重复:
  Select and insert value unique number of times in R

我想在1到10之间生成2000个随机数,这样对于每个随机数我都有相同数量的实例。

在这种情况下,每个号码为200。

应该随机的是它的生成顺序。

我有以下问题:

我有一个包含2000个条目的数组但不是每个都有唯一值,例如它的开头是这样的:

11112233333333344445667777777777

并包含2000个条目。

我想生成随机数并为每个UNIQUE值分配一个单独的随机数,但每个值都有一个条目

所以我的预期结果如下:

original array: 11112233333333344445667777777777
random numbers: 33334466666666699991778888888888

4 个答案:

答案 0 :(得分:5)

您可以通过几个步骤完成此操作:

my_numbers <- rep(1:10, each=200)
my_randomizer <- sample(seq_along(my_numbers), length(my_numbers))

my_random_numbers <- my_numbers[my_randomizer]

基于编辑:

我会使用rle。听起来你没有数组,而是一个矢量:

my_array_rled <- rle(my_array)

my_random_numbers <- sample(1:10, length(unique(my_array)))

my_array_rled$values <- factor(my_array_rled$values)
levels(my_array_rled$values) <- my_random_numbers

my_array_randomized <- inverse.rle(my_array_rled)

答案 1 :(得分:1)

如果我理解正确,你可以使用“rep”复制你的随机数200次,然后“sample”来随机化你得到的矢量。

x <- sample(rep(runif(2000,1,10),200))

答案 2 :(得分:0)

非矢量化代码:

# using a seed for reproducible example
set.seed(2)

original_array <- c(1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,4,4,4,4,5,6,6,7,7,7,7,7,7,7,7,7,7)
random_numbers <- numeric(length=length(original_array))

rdnum <- sample(unique(original_array), length(unique(original_array)))

for ( i in  1:length(unique(original_array)))
random_numbers[original_array == i] <- rdnum[i]

random_numbers
2 2 2 2 5 5 3 3 3 3 3 3 3 3 3 1 1 1 1 6 7 7 4 4 4 4 4 4 4 4 4 4

答案 3 :(得分:0)

table函数与sample在这种情况下非常方便:

set.seed(1)

     ## ASSUMING ORIGINAL IS A VECTOR
original <- c(1, 1, 1, 1, 2,2,3,3,3,3,3,3,3,3,3,4,4,4,4,5,6,6,7,7,7,7,7,7,7,7,7,7)

     ## CREATE A TABLE OF ALL THE VALUES 
tabl <- table(original)

     ## RNG is the sample range to select from.  Assuming 1:10 in this example
RNG <- 1:10

     ## PICK VALUES RANDOMLY FROM RNG
tabl[] <- sample(RNG, length(tabl), replace=FALSE)
# note that the `names` of `tabl` will contain the values from `original`
# whereas the values of `tabl` will contain the new random value. 

     ## ASSIGN NEW VALUES 
randomNums <- original
for(i in seq(length(tabl)))
  randomNums[ original==as.numeric(names(tabl))[[i]] ] <- tabl[[i]]

结果:

  rbind(orig=original, rand=randomNums)

orig:  1 1 1 1  2 2  3 3 3 3 3 3 3 3 3  4 4 4 4  5  6 6  7 7 7 7 7 7 7 7 7 7
rand:  3 3 3 3  4 4  5 5 5 5 5 5 5 5 5  7 7 7 7  2  8 8  9 9 9 9 9 9 9 9 9 9