このようなデータフレーム (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