Membagi data menjadi N kelompok yang sama


11

Saya memiliki kerangka data yang berisi nilai di 4 kolom:

Sebagai contoh: ID, price, click count,rating

Yang ingin saya lakukan adalah "memecah" kerangka data ini menjadi N grup yang berbeda di mana setiap grup akan memiliki jumlah baris yang sama dengan distribusi harga, jumlah klik dan atribut penilaian yang sama.

Setiap saran sangat dihargai, karena saya tidak punya ide sedikit pun tentang cara mengatasi ini!


Apakah Anda hanya ingin membuat N frame data terpisah yang memisahkan subset dari dokumen asli? Apa yang Anda maksud dengan "distribusi yang sama" dari harga, jumlah klik, dan peringkat?
Alex A.

Ya, mencari himpunan bagian dari bingkai data asli. Pada pertanyaan kedua Anda, misalkan saya memiliki nilai jumlah kunjungan dari 1 hingga 10 dan memutuskan untuk membuat 3 himpunan bagian yang berbeda, sehingga akan memilih beberapa baris dalam setiap grup dari 1 hingga 4 kotak hitung kunjungan, beberapa baris dari 4 hingga 7 kotak hitung kunjungan dan beberapa dari 7 hingga 10 kotak jumlah kunjungan dan ini harus dipenuhi sehubungan dengan semua atribut (harga, jumlah klik dan peringkat). Ini seperti mengambil sampel data ke dalam kelompok yang berbeda dengan probabilitas atribut yang sama. Semoga ini membantu.


Pertanyaannya meminta pemisahan yang menjaga distribusi variabel. Tanpa informasi lebih lanjut, tidak mungkin untuk menentukan metode yang tepat untuk mendekati masalah ini. Saya memilih untuk memigrasikan ini ke CV.com
DWin

Apakah Anda bermaksud hanya mempertahankan distribusi marginal atau distribusi gabungan?
kjetil b halvorsen

Jawaban:


12

Jika saya memahami pertanyaan dengan benar, ini akan memberi Anda apa yang Anda inginkan. Dengan asumsi frame data Anda dipanggil dfdan telah Anda Ntentukan, Anda dapat melakukan ini:

split(df, sample(1:N, nrow(df), replace=T))

Ini akan mengembalikan daftar frame data di mana setiap frame data terdiri dari baris yang dipilih secara acak df. Secara default sample()akan menetapkan probabilitas yang sama untuk setiap grup.


6

Ini adalah jawaban yang sangat terlambat, tetapi saya menemukan halaman ini ketika mencari di Google apakah masalah seperti yang disebutkan pernah dibahas di mana saja. Mungkin jawaban saya akan membantu jika seseorang menemukan halaman ini mulai sekarang.

Saya menulis paket R, yang melakukan persis seperti yang ditanyakan oleh pertanyaan: dibutuhkan a data.framedan membuat N kelompok yang berbeda ketika mencoba untuk meminimalkan perbedaan antara kelompok dalam satu atau beberapa kriteria. Ini menggunakan metode sederhana berdasarkan penugasan acak berulang , yang juga merupakan metode yang disarankan dalam respons yang disetujui.

Ini adalah tautan ke paket minDiff :

Untuk mengatasi masalah yang disebutkan, Anda dapat menggunakan:

library(minDiff)
assigment <- create_groups(dataframe, criteria_scale = c("price", "click count", "rating"), sets_n = N, repetitions = 1000)

The repetitionsArgumen akan menentukan seberapa sering Anda secara acak membuat grup yang berbeda. Tugas terbaik - tugas yang memiliki perbedaan minimal antar grup - akan dikembalikan.


5

Meskipun jawaban Alex A memberikan probabilitas yang sama untuk masing-masing kelompok, itu tidak memenuhi permintaan pertanyaan agar kelompok memiliki jumlah baris yang sama. Dalam R:

stopifnot(nrow(df) %% N == 0)
df    <- df[order(runif(nrow(df))), ]
bins  <- rep(1:N, nrow(df) / N)
split(df, bins)

3
Pengamatan Anda tentang kekurangan jawaban yang diterima adalah bagus. Namun, jawaban Anda masih tidak membahas bagian dari pertanyaan yang menarik (dan merupakan satu-satunya alasan itu tidak ditutup di sini): bagaimana Anda mencapai "distribusi harga, jumlah klik dan atribut penilaian" yang sama di setiap grup ?
whuber

@whuber Bisakah Anda mengusulkan jawaban untuk itu di sini?
Léo Léopold Hertz 준영

Jawabannya harus bergantung pada apa arti "distribusi yang sama". Tampaknya pertanyaannya adalah meminta pengamatan cluster berdasarkan empat variabel, dengan masing-masing cluster memiliki jumlah pengamatan yang sama. Ada banyak cara untuk melakukan ini.
whuber

0

Ini dapat diatasi dengan bersarang menggunakan tidyr / dplyr

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
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.