Saya kesulitan menemukan fungsi yang sesuai yang akan mengembalikan jumlah baris tertentu yang diambil secara acak tanpa penggantian dari bingkai data dalam bahasa R? Adakah yang bisa membantu saya?
333
Pertama-tama buat beberapa data:
> df = data.frame(matrix(rnorm(20), nrow=10))
> df
X1 X2
1 0.7091409 -1.4061361
2 -1.1334614 -0.1973846
3 2.3343391 -0.4385071
4 -0.9040278 -0.6593677
5 0.4180331 -1.2592415
6 0.7572246 -0.5463655
7 -0.8996483 0.4231117
8 -1.0356774 -0.1640883
9 -0.3983045 0.7157506
10 -0.9060305 2.3234110
Kemudian pilih beberapa baris secara acak:
> df[sample(nrow(df), 3), ]
X1 X2
9 -0.3983045 0.7157506
2 -1.1334614 -0.1973846
10 -0.9060305 2.3234110
?sample
di konsol R untuk membaca tentang fungsi itu.set.seed(42)
) Setiap kali Anda ingin mereproduksi sampel spesifik itu.sample.int
akan sedikit lebih cepat saya percaya:library(microbenchmark);microbenchmark( sample( 10000, 100 ), sample.int( 10000, 100 ), times = 10000 )
Jawaban yang diberikan John Colby adalah jawaban yang tepat. Namun jika Anda seorang
dplyr
pengguna, ada juga jawabannyasample_n
:secara acak sampel 10 baris dari kerangka data. Itu panggilan
sample.int
, jadi benar-benar adalah jawaban yang sama dengan kurang mengetik (dan menyederhanakan penggunaan dalam konteks magrittr karena dataframe adalah argumen pertama).sumber
Tulis satu! Membungkus jawaban JC memberi saya:
Sekarang buat lebih baik dengan memeriksa dulu apakah n <= nrow (df) dan berhenti dengan kesalahan.
sumber
The
data.table
paket menyediakan fungsiDT[sample(.N, M)]
, sampling M baris acak dari tabel dataDT
.sumber
Demi kelengkapan saja:
dplyr juga menawarkan untuk menggambar proporsi atau fraksi sampel dengan
Ini sangat mudah misalnya dalam pembelajaran mesin ketika Anda harus melakukan rasio split tertentu seperti 80%: 20%
sumber
EDIT : Jawaban ini sekarang sudah usang, lihat versi yang diperbarui .
Dalam paket R saya, saya telah meningkatkan
sample
sehingga sekarang berperilaku seperti yang diharapkan juga untuk bingkai data:Ini dicapai dengan membuat
sample
metode generik S3 dan menyediakan fungsionalitas (sepele) yang diperlukan dalam suatu fungsi. Panggilan untuksetMethod
memperbaiki semuanya. Implementasi asli masih dapat diakses melaluibase::sample
.sumber
sample.default(df, ...)
frame datadf
, sampel dari kolom frame data, sebagai frame data diimplementasikan sebagai daftar vektor dengan panjang yang sama.install_github('kimisc', 'krlmlr')
dan berlariError: Does not appear to be an R package (no DESCRIPTION)
. Ada jalan lain?[
Operator untuk frame data counterexample. Juga, tolong beri tahu saya: Apakah Anda pernah, hanya sekali saja, digunakansample
untuk mengambil sampel kolom dari bingkai data?iris[2]
berfungsi seperti daftar, seperti halnyairis[[2]]
. Atauiris$Species
,,lapply(iris, mean)
... Frame data adalah daftar. Jadi saya berharap mereka berperilaku seperti mereka. Dan ya, saya sudah menggunakan sampel (myDataframe). Pada dataset di mana setiap variabel berisi data ekspresi gen tunggal. Metode spesifik Anda membantu pengguna pemula, tetapi juga secara efektif mengubah carasample()
berperilaku. Catatan saya menggunakan "seperti yang diharapkan" dari pandangan programmer. Yang berbeda dengan intuisi umum. Ada banyak hal dalam R yang tidak kompatibel dengan intuisi umum ...;)Dalam paket R saya ada fungsi
sample.rows
hanya untuk tujuan ini:Meningkatkan
sample
dengan menjadikannya fungsi S3 generik adalah ide yang buruk, menurut komentar Joris Meys untuk jawaban sebelumnya .sumber
Pilih sampel acak dari jenis tibble di R:
nrow mengambil tibble dan mengembalikan jumlah baris. Parameter pertama yang diteruskan
sample
adalah rentang dari 1 hingga akhir tibble Anda. Parameter kedua yang diteruskan ke sampel, 150, adalah berapa banyak sampel acak yang Anda inginkan. Mengiris braket persegi menentukan baris indeks yang dikembalikan. Variabel 'a' mendapat nilai dari random sampling.sumber
Anda bisa melakukan ini:
Di atas saya baru saja membuat bingkai data dengan 10 kolom dan 100 baris, ok?
Sekarang Anda dapat mencicipi dengan
sample_n
:sumber
Saya baru di R, tapi saya menggunakan metode mudah ini yang berfungsi untuk saya:
PS: Jangan ragu untuk mencatat jika ada kekurangan yang tidak saya pikirkan.
sumber
Anda bisa melakukan ini:
sumber