Verileri N eşit gruba böl


11

4 Sütunlar arasında değerler içeren bir veri çerçevesi var:

Örneğin: ID, price, click count,rating

Ne yapmak istiyorum bu veri çerçevesi her grup aynı fiyat, tıklama sayısı ve derecelendirme öznitelikleri dağılımı ile eşit sayıda satır olacak N farklı gruplara bölmek olduğunu.

Bununla nasıl başa çıkılacağı hakkında en ufak bir fikrim olmadığından, herhangi bir tavsiye kesinlikle takdir edilmektedir!


Sadece orijinalin ayrık alt kümeleri olan N ayrı veri çerçevesi mi oluşturmak istiyorsunuz? Fiyat, tıklama sayısı ve derecelendirmelerin "aynı dağılımı" ile ne demek istiyorsun?
Alex

Evet, orijinal veri çerçevesinin alt kümelerini arıyorum. İkinci sorunuzda, 1'den 10'a kadar ziyaret sayıları değerlerine sahip olduğumu ve 3 farklı alt küme oluşturmaya karar verdiğimizi varsayalım, bu nedenle her grupta 1 ila 4 ziyaret sayısı kovasından bazı satırlar, 4 ila 7 ziyaret sayısı kovası ve bazıları 7 ila 10 ziyaret sayısı kova ve bu tüm özellikleri (fiyat, tıklama sayısı ve derecelendirme) açısından tatmin edilmelidir. Verileri eşit özellik olasılığı olan farklı gruplara örneklemek gibidir. Bu yardımcı olur umarım.


Soru, değişkenlerin dağılımını koruyan bir bölünme ister. Daha fazla bilgi olmadan, bu soruna yaklaşımın doğru yöntemini belirlemek mümkün değildir. Bunu CV.com'a taşımak için oy veriyorum
DWin

Sadece marjinal dağılımları mı yoksa eklem dağılımını mı korumak istiyorsunuz?
kjetil b halvorsen

Yanıtlar:


12

Soruyu doğru anlarsam, bu istediğinizi elde eder. Veri çerçevenizin çağrıldığını dfve Ntanımladığınızı varsayarak bunu yapabilirsiniz:

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

Bu, her veri çerçevesinin rastgele seçilen satırlardan oluştuğu veri çerçevelerinin bir listesini döndürür df. Varsayılan sample()olarak her gruba eşit olasılık atar.


6

Bu çok geç bir cevap, ancak bu sayfayı, belirtilen sorunun herhangi bir yerde tartışılıp tartışılmadığını araştırırken buldum. Belki birisi bu sayfayı bundan sonra bulursa cevabım yardımcı olacaktır.

Sorunun tam olarak ne istediğini yapan bir R paketi yazdım: data.framebir veya birkaç kriterdeki gruplar arasındaki farkları en aza indirmeye çalışırken bir alır ve N farklı grup oluşturur. Onaylı yanıtta önerilen yöntem olan tekrarlanan rastgele atamaya dayanan basit bir yöntem kullanır .

Bu, minDiff paketinin bağlantısıdır :

Belirtilen sorunun üstesinden gelmek için şunları kullanabilirsiniz:

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

repetitionsArgüman rastgele farklı grupları oluşturmak ne sıklıkta belirleyecektir. En iyi ödev - gruplar arasında minimum farklılığa sahip olan ödev - iade edilir.


5

Alex A'nın cevabı her grup için eşit bir olasılık verse de, soruların grupların eşit sayıda satıra sahip olma talebini karşılamıyor. R cinsinden:

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

3
Kabul edilen cevabın eksiklikleri hakkındaki gözleminiz iyi bir cevaptır. Bununla birlikte, cevabınız hala sorunun ilginç olan kısmını ele almıyor (ve burada kapatılmamasının tek nedeni budur): her grupta "aynı fiyat, tıklama sayısı ve derecelendirme özellikleri dağılımı" nı nasıl elde edersiniz? ?
whuber

@whuber Burada bir cevap verebilir misiniz?
Léo Léopold Hertz 준영

Cevap, "aynı dağılımın" ne anlama geldiğine bağlı olmalıdır. Görünüşe göre soru dört değişkene dayalı olarak küme gözlemleri istiyor , her küme aynı sayıda gözleme sahip. Bunu yapmanın sayısız yolu var.
whuber

0

Bu, tidyr / dplyr kullanılarak yuvalama ile çözülebilir

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.