2

重複の可能性:
Rで値を一意の回数だけ選択して挿入する

乱数ごとに同じ数のインスタンスを持つように、1 から 10 までの 2000 個の乱数を生成したいと思います。

この場合、数値ごとに 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

ベクトル化されていないコード:

# 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 に答える
0

table関数 withは、こ​​の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
于 2012-12-05T17:44:33.500 に答える