このようなデータフレーム(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
PS。 2列のランダム化に関する前回の質問への前回の回答については、Gavin Simpson、Joris Meys、Chaseの協力に感謝します。
R data.frameが与えられた場合:
> 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
これは、パッケージdplyr
を使用してdata.frame
をシャッフルする別の方法です。
行ごと:
df2 <- slice(df1, sample(1:n()))
または
df2 <- sample_frac(df1, 1L)
列単位:
df2 <- select(df1, one_of(sample(names(df1))))
veganパッケージのpermatswap()
を見てください。行と列の両方の合計を維持する例を次に示しますが、これを緩和して行または列の合計の1つのみを修正できます。
mat <- matrix(c(1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1), ncol = 5)
set.seed(4)
out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")
これは与える:
R> out$perm[[1]]
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 1 1 1
[2,] 0 1 0 1 0
[3,] 0 0 0 1 1
[4,] 1 0 0 0 1
R> out$perm[[2]]
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 0 1 1
[2,] 0 0 0 1 1
[3,] 1 0 0 1 0
[4,] 0 0 1 0 1
呼び出しを説明するには:
out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")
times
は、必要なランダム化行列の数です。ここでは99burnin
は、ランダムサンプルの取得を開始する前に行われたスワップの数です。これにより、ランダム化された各マトリックスの取得を開始する前に、サンプリング元のマトリックスを非常にランダムにすることができますthin
は、thin
スワップごとにランダムドローのみを行うことを示しますmtype = "prab"
は、マトリックスを存在/不在、つまりバイナリ0/1データとして扱うと言います。いくつか注意すべき点がありますが、これは列または行がランダム化されていることを保証するものではありませんが、burnin
が十分に長い場合、その可能性が十分にあります。また、必要以上にランダムな行列を描画し、すべての要件に一致しない行列を破棄することもできます。
行ごとに異なる数の変更を行うという要件も、ここでは説明しません。この場合も、必要な数よりも多くのマトリックスをサンプリングし、この要件を満たさないマトリックスを破棄できます。
rパッケージのrandomizeMatrix
関数を使用することもできますpicante
例:
test <- matrix(c(1,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0),nrow=4,ncol=4)
> test
[,1] [,2] [,3] [,4]
[1,] 1 0 1 0
[2,] 1 1 0 1
[3,] 0 0 0 0
[4,] 1 0 1 0
randomizeMatrix(test,null.model = "frequency",iterations = 1000)
[,1] [,2] [,3] [,4]
[1,] 0 1 0 1
[2,] 1 0 0 0
[3,] 1 0 1 0
[4,] 1 0 1 0
randomizeMatrix(test,null.model = "richness",iterations = 1000)
[,1] [,2] [,3] [,4]
[1,] 1 0 0 1
[2,] 1 1 0 1
[3,] 0 0 0 0
[4,] 1 0 1 0
>
オプションnull.model="frequency"
は列の合計を維持し、richness
は行の合計を維持します。主にコミュニティエコロジーの種存在不在データセットのランダム化に使用されますが、ここではうまく機能します。
この関数には他のヌルモデルオプションもあります。詳細については、次のリンク(36ページ)を参照してください picante
documentation
もちろん、各行をサンプリングできます:
sapply (1:4, function (row) df1[row,]<<-sample(df1[row,]))
行自体をシャッフルするため、各行の1
の数は変更されません。小さな変更と列でもうまく機能しますが、これは読者のための練習です:-P
次のようなものを使用して、データフレーム内の同じ数のアイテムを「サンプリング」することもできます。
nr<-dim(M)[1]
random_M = M[sample.int(nr),]
データフレーム内のランダムサンプルと順列マトリックス形式の場合は、data.frameに変換します。ベースパッケージインデックス= sample(1:nrow(df1)、size = 1 * nrow(df1))からのサンプル関数を使用しますランダムサンプルと順列