Saya memiliki dataframe (df1) seperti ini.
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
Kolom d1 ... d4 adalah nama rowname, baris f1 ... f5 adalah nama kolom.
Untuk melakukan sample (df1), saya mendapatkan dataframe baru dengan hitungan 1 sama dengan df1. Jadi, hitungan 1 dipertahankan untuk seluruh kerangka data tetapi tidak untuk setiap baris atau setiap kolom.
Apakah mungkin untuk melakukan pengacakan baris atau kolom?
Saya ingin mengacak kolom df1 untuk setiap kolom, yaitu nomor 1 di setiap kolom tetap sama. dan setiap kolom perlu diubah setidaknya satu kali. Sebagai contoh, saya mungkin memiliki df2 acak seperti ini: (Tercatat bahwa hitungan 1 di setiap kolom tetap sama tetapi jumlah 1 di setiap baris berbeda.
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
Demikian juga, saya juga ingin mengacak baris df1 untuk setiap baris, yaitu no. dari 1 di setiap baris tetap sama, dan setiap baris perlu diubah (tetapi jumlah entri yang diubah bisa berbeda). Misalnya, df3 yang diacak bisa menjadi seperti ini:
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. Terima kasih banyak atas bantuan dari Gavin Simpson, Joris Meys, dan Chase untuk jawaban sebelumnya atas pertanyaan saya sebelumnya tentang pengacakan dua kolom.
sumber
Jawaban:
Mengingat R data.frame:
Acak baris-bijaksana:
Secara default
sample()
mengurutkan ulang elemen yang diteruskan sebagai argumen pertama secara acak. Ini berarti bahwa ukuran default adalah ukuran dari array yang diteruskan. Meneruskan parameterreplace=FALSE
(default) untuksample(...)
memastikan bahwa pengambilan sampel dilakukan tanpa penggantian yang menyelesaikan shuffle bijaksana baris.Acak berdasarkan kolom:
sumber
Ini adalah cara lain untuk mengocok
data.frame
paket yang menggunakandplyr
:baris-bijaksana:
atau
kolom-bijaksana:
sumber
Lihatlah
permatswap()
di vegan paket. Berikut adalah contoh mempertahankan total baris dan kolom, tetapi Anda bisa melonggarkannya dan memperbaiki hanya satu dari jumlah baris atau kolom.Ini memberi:
Untuk menjelaskan panggilan:
times
adalah jumlah matriks acak yang Anda inginkan, di sini 99burnin
adalah jumlah swap yang dilakukan sebelum kita mulai mengambil sampel acak. Hal ini memungkinkan matriks yang kita contohkan menjadi sangat acak sebelum kita mulai mengambil setiap matriks acak kitathin
mengatakan hanya mengambil undian acak setiapthin
swapmtype = "prab"
mengatakan memperlakukan matriks sebagai ada / tidak adanya, yaitu data 0/1 biner.Beberapa hal yang perlu diperhatikan, ini tidak menjamin bahwa setiap kolom atau baris telah diacak, tetapi jika
burnin
cukup panjang seharusnya ada kemungkinan besar hal itu terjadi. Selain itu, Anda dapat menggambar lebih banyak matriks acak daripada yang Anda butuhkan dan membuang matriks yang tidak sesuai dengan semua persyaratan Anda.Persyaratan Anda untuk memiliki jumlah perubahan yang berbeda per baris, juga tidak dibahas di sini. Sekali lagi Anda dapat mencicipi lebih banyak matriks daripada yang Anda inginkan dan kemudian membuang matriks yang tidak memenuhi persyaratan ini juga.
sumber
Anda juga dapat menggunakan
randomizeMatrix
fungsi dalam paket R.picante
contoh:
Opsi ini
null.model="frequency"
mempertahankan jumlah kolom danrichness
mempertahankan jumlah baris. Meskipun terutama digunakan untuk mengacak kumpulan data ketiadaan spesies dalam ekologi komunitas, metode ini berfungsi dengan baik di sini.Fungsi ini memiliki opsi model null lainnya juga, lihat tautan berikut untuk detail selengkapnya (halaman 36) dari dokumentasi
picante
sumber
Tentu saja Anda dapat mengambil sampel setiap baris:
akan mengocok baris itu sendiri, sehingga jumlah
1
di setiap baris tidak berubah. Perubahan kecil dan juga berfungsi dengan baik dengan kolom, tetapi ini adalah latihan untuk pembaca :-Psumber
Anda juga dapat "mengambil sampel" jumlah item yang sama dalam bingkai data Anda dengan sesuatu seperti ini:
sumber
dim(M)[1]
, Anda dapat menggunakannrow(M)
sehingga seluruh prosedur menjadi satu baris:random_M <- M[nrow(M),]
Jika tujuannya adalah untuk mengacak setiap kolom secara acak, beberapa jawaban di atas tidak berfungsi karena kolom diacak secara bersamaan (ini mempertahankan korelasi antar kolom). Yang lain membutuhkan penginstalan paket. Namun ada satu baris:
sumber
Random Samples and Permutations ina dataframe Jika dalam bentuk matriks konversikan ke dalam data.frame gunakan fungsi sample dari base package indexes = sample (1: nrow (df1), size = 1 * nrow (df1)) Random Samples and Permutations
sumber