Cara mengambil banyak sampel 10 dari daftar besar, tanpa penggantian keseluruhan


12

Saya punya satu set besar data (20.000 titik data), dari mana saya ingin mengambil sampel berulang 10 titik data. Namun, setelah saya mengambil 10 poin data itu, saya ingin mereka tidak dipilih lagi.

Saya sudah mencoba menggunakan samplefungsi ini, tetapi sepertinya tidak memiliki opsi untuk mengambil sampel tanpa penggantian lebih dari beberapa panggilan fungsi. Apakah ada cara sederhana untuk melakukan hal ini?

Jawaban:


9

Anda bisa memanggil sampel satu kali pada seluruh set data untuk membukanya. Kemudian ketika Anda ingin mendapatkan sampel, Anda bisa mengambil 10. pertama. Jika Anda ingin sampel lain ambil 10. berikutnya dan seterusnya.


9

Pikiran Dason, diimplementasikan dalam R:

sample <- split(sample(datapoints), rep(1:(length(datapoints)/10+1), each=10))
sample[[13]] # the thirteenth sample

(+1) Kode R sangat rapi. Dari catatan, itu tidak akan berfungsi jika aneh. n
chl

@ chl, terima kasih! Tapi saya pikir itu akan berhasil. Tugasnya adalah untuk memberikan sampel ukuran 10 dari satu set titik data. Asumsikan n = panjang (titik data). Kode memberikan jumlah maksimum (n% /% 10) dari sampel tersebut. Kasus sudut pertama adalah n <10 (tetap tidak dimasukkan dalam pernyataan masalah dengan menggambarkan dataset sebagai 'besar', yaitu n> 10). Dalam hal ini Anda mendapatkan titik data kembali dan peringatan (bukan kesalahan). Kasus sudut kedua adalah jika ada elemen menggantung (ketika n %% 10! = 0). Kemudian Anda mendapatkan sampel sebanyak mungkin dan peringatan (bukan kesalahan). Situasi ganjil dimasukkan dalam salah satu dari dua kasus ini.
conjugateprior

Tampaknya elemen pertama dari daftar adalah panjang 11, bukan 10, dan sum(unlist(lapply(sample, length)))mengembalikan panjang datapoints(yang saya setel ke 1001).
chl

@chl Sial! Anda benar.
conjugateprior

2

Ini seharusnya bekerja:

x <- rnorm(20000)
x.copy <- x
samples <- list()
i <- 1
while (length(x) >= 10){
    tmp <- sample(x, 10)
    samples[[i]] <- tmp
    i <- i+1
    x <- x[-match(tmp, x)]
}

table(unlist(samples) %in% x.copy)

Namun, saya tidak berpikir itu solusi paling elegan ...


1

@conjugateprior Jawaban Anda mengarah ke arah yang benar. Tetapi setidaknya untuk R-versi 3.4.3 saya saat ini, tidak berfungsi. Namun dengan beberapa penyesuaian berfungsi:

mysample<-split(sample(length(datapoints)), 1:10)
mysample[[9]] ## the ninth sample

Karena saya belum bisa berkomentar saya memilih untuk menjawab di sini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.