データフレームを行方向と列方向にランダム化(または並べ替え)するにはどうすればよいでしょうか? 質問する

データフレームを行方向と列方向にランダム化(または並べ替え)するにはどうすればよいでしょうか? 質問する

このようなデータフレーム (df1) があります。

     f1   f2   f3   f4   f5
d1   1    0    1    1    1  
d2   1    0    0    1    0
d3   0    0    0    1    1
d4   0    1    0    0    1

d1...d4 列は行名、f1...f5 行は列名です。

sample(df1) を実行すると、df1 と同じカウント 1 の新しいデータフレームが取得されます。したがって、カウント 1 はデータフレーム全体に対して保持されますが、各行または各列に対しては保持されません。

行方向または列方向のランダム化を行うことは可能ですか?

各列について df1 を列ごとにランダム化します。つまり、各列の 1 の数は同じままです。各列は少なくとも 1 回変更する必要があります。たとえば、次のようなランダム化された df2 があるとします。(各列の 1 の数は同じままですが、各行の 1 の数は異なることに注意してください。

     f1   f2   f3   f4   f5
d1   1    0    0    0    1  
d2   0    1    0    1    1
d3   1    0    0    1    1
d4   0    0    1    1    0

同様に、各行の df1 を行ごとにランダム化します。つまり、各行の 1 の数は同じままで、各行を変更する必要があります (ただし、変更されたエントリの数は異なる場合があります)。たとえば、ランダム化された df3 は次のようになります。

     f1   f2   f3   f4   f5
d1   0    1    1    1    1  <- two entries are different
d2   0    0    1    0    1  <- four entries are different
d3   1    0    0    0    1  <- two entries are different
d4   0    0    1    0    1  <- two entries are different

追伸:2 つの列をランダム化するという私の以前の質問に回答してくれた Gavin Simpson、Joris Meys、Chase に感謝します。

ベストアンサー1

R のデータフレームが与えられます:

> df1
  a b c
1 1 1 0
2 1 0 0
3 0 1 0
4 0 0 0

行ごとにシャッフルします。

> df2 <- df1[sample(nrow(df1)),]
> df2
  a b c
3 0 1 0
4 0 0 0
2 1 0 0
1 1 1 0

デフォルトでは、sample()最初の引数として渡された要素をランダムに並べ替えます。つまり、デフォルトのサイズは渡された配列のサイズになります。パラメータreplace=FALSE(デフォルト) を渡すと、sample(...)置換なしでサンプリングが実行され、行単位のシャッフルが実行されます。

列方向にシャッフルします:

> df3 <- df1[,sample(ncol(df1))]
> df3
  c a b
1 0 1 1
2 0 1 0
3 0 0 1
4 0 0 0

おすすめ記事