3

データフレーム内のすべてのデータをランダム化する方法を知っている人はいますか? つまり、データが行と列で並べ替えられた新しいデータ フレームを取得して、最初のデータ フレームと同じ番号の偶然の新しいデータ フレームを取得します。

このようなもの:

ありがとう!

4

3 に答える 3

9

sample()行数と列数を別々に使用してから、 の結果でインデックスを付けるだけsample()です。

df <- data.frame(matrix(1:25, ncol = 5))

permDF <- function(x) {
  nr <- nrow(x)
  nc <- ncol(x)
  x[sample(nr), sample(nc)]
}

> permDF(df)
  X3 X4 X2 X1 X5
4 14 19  9  4 24
5 15 20 10  5 25
1 11 16  6  1 21
3 13 18  8  3 23
2 12 17  7  2 22
> permDF(df)
  X1 X2 X4 X3 X5
2  2  7 17 12 22
4  4  9 19 14 24
1  1  6 16 11 21
3  3  8 18 13 23
5  5 10 20 15 25

これにより、行と列の値が一緒に保持されますが、列と行の順序が異なることに注意してください。データ セットを完全にランダム化する場合、データ フレームを使用する簡単な方法はありません。マトリックスを使用してこれを行いますが、@DWinが示すように、もう少し作業が必要です

mat <- matrix(1:25, ncol = 5)
pmat <- mat
set.seed(42)
pmat[] <- mat[sample(length(mat))]
pmat

> pmat
     [,1] [,2] [,3] [,4] [,5]
[1,]   23   11   24   10    5
[2,]   25   21   20    9    8
[3,]    7    3   13    1   18
[4,]   19   12    4   16    2
[5,]   14   17    6   15   22

上記のものとはわずかに異なるインデックスを使用して、マトリックスと同じ方法でデータフレームで行っていたことを行うことができます

mat[sample(nrow(mat)), sample(ncol(mat))]

> set.seed(42)
> mat[sample(nrow(mat)), sample(ncol(mat))]
     [,1] [,2] [,3] [,4] [,5]
[1,]   15   25    5   10   20
[2,]   14   24    4    9   19
[3,]   11   21    1    6   16
[4,]   12   22    2    7   17
[5,]   13   23    3    8   18
于 2013-05-10T16:57:16.443 に答える
6

マトリックスでこれを行う方がはるかに高速です。

dm <- matrix(1:25, ncol = 5); dm
dm[] <- sample(dm); dm

編集:これは間違っています:「最初に列を並べ替え、次に行を並べ替えると、ベクトル全体を並べ替えてから元の次元に再形成するのと同じ結果が得られると確信しています。」<\s>

「シンプソン法」では異なる結果が得られ、要求されたものである可能性があります (ただし、これをシミュレーション作業の一部として実行すると、マトリックス テストベッドを使用した方が高速になります)。

 dm <- dm[ sample(nrow(dm)), sample( ncol(dm)) ]
于 2013-05-10T17:04:17.340 に答える