2

可能重复:
在 R 中选择和插入值的唯一次数

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

在这种情况下,每个数字 200。

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

我有以下问题:

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

11112233333333344445667777777777

包含 2000 个条目。

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

所以我的预期结果是这样的:

original array: 11112233333333344445667777777777
random numbers: 33334466666666699991778888888888
4

4 回答 4

6

您可以通过几个步骤来做到这一点:

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)
于 2012-12-05T16:47:50.930 回答
1

如果我理解正确,您可以使用“rep”复制随机数 200 次,并使用“sample”随机化生成的向量。

x <- sample(rep(runif(2000,1,10),200))
于 2012-12-05T16:51:04.807 回答
0

对于这个场景,table函数 withsample非常方便:

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
于 2012-12-05T17:44:33.500 回答
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
于 2012-12-05T17:14:24.807 回答