एन बराबर समूहों में डेटा विभाजित करें


11

मेरे पास एक डेटाफ्रेम है जिसमें 4 कॉलम के मान हैं:

उदाहरण के लिए: ID, price, click count,rating

मैं क्या करना चाहूंगा इस डेटाफ्रेम को एन अलग-अलग समूहों में "विभाजित" करना है जहां प्रत्येक समूह में समान वितरण मूल्य के साथ पंक्तियों की समान संख्या होगी, गिनती और रेटिंग विशेषताओं पर क्लिक करें।

किसी भी सलाह की दृढ़ता से सराहना की जाती है, क्योंकि मुझे इससे निपटने का मामूली विचार नहीं है!


क्या आप अभी N अलग डेटा फ्रेम बनाना चाहते हैं जो मूल के सबसेट उपसमूह हैं? मूल्य के "समान वितरण" से आपका क्या मतलब है, गिनती और रेटिंग पर क्लिक करें।
एलेक्स ए।

हां, मूल डेटा फ़्रेम के सबसेट की तलाश है। आपके दूसरे प्रश्न पर, मान लीजिए कि मेरे पास 1 से 10 तक की गिनती के मान हैं और 3 अलग-अलग सबसेट बनाने का फैसला किया है, इसलिए प्रत्येक समूह में 1 से 4 तक की कुछ पंक्तियों का चयन करेंगे गिनती की बाल्टी, कुछ पंक्तियों में 4 से 7 की गिनती की बाल्टी और कुछ 7 से 10 तक की गिनती बाल्टी पर जाएँ और यह सभी विशेषताओं (मूल्य, क्लिक गणना और रेटिंग) के संबंध में संतुष्ट होना चाहिए। यह विशेषताओं के समान संभाव्यता के साथ विभिन्न समूहों में डेटा का नमूना लेने जैसा है। उम्मीद है की यह मदद करेगा।


प्रश्न एक विभाजन का अनुरोध करता है जो चर के वितरण को संरक्षित करता है। अधिक जानकारी के बिना, इस समस्या को हल करने के लिए सही विधि निर्धारित करना संभव नहीं है। मैं इसे CV.com पर प्रवासित करने के लिए मतदान करता हूं
DWin

क्या आपका मतलब केवल सीमांत वितरण या संयुक्त वितरण को संरक्षित करना है?
kjetil b halvorsen

जवाबों:


12

यदि मैं प्रश्न को सही ढंग से समझता हूं, तो यह आपको वही मिलेगा जो आप चाहते हैं। यह मानते हुए कि आपका डेटा फ्रेम कहा जाता है dfऔर आपने Nपरिभाषित किया है, आप ऐसा कर सकते हैं:

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

यह उन डेटा फ़्रेमों की सूची लौटाएगा, जहां से प्रत्येक डेटा फ़्रेम में यादृच्छिक रूप से चयनित पंक्तियों का समावेश होता है df। डिफ़ॉल्ट रूप sample()से प्रत्येक समूह के लिए समान संभावना प्रदान करेगा।


6

यह एक बहुत देर से जवाब है, लेकिन मैंने इस पृष्ठ को गुगली करते हुए पाया कि क्या समस्या के रूप में कभी भी कहीं भी चर्चा की गई है। शायद मेरा जवाब मदद करेगा अगर कोई इस पृष्ठ को अभी से खोज ले।

मैंने एक आर पैकेज लिखा था, जो वास्तव में पूछे जाने वाले प्रश्न को करता है: यह data.frameएक या कई मानदंडों में समूहों के बीच के अंतर को कम करने की कोशिश करते हुए एन और अलग-अलग समूह बनाता है। यह बार-बार रैंडम असाइनमेंट के आधार पर एक सरल विधि का उपयोग करता है , जो अनुमोदित प्रतिक्रिया में सुझाई गई विधि भी है।

यह पैकेज minDiff का लिंक है :

बताई गई समस्या से निपटने के लिए, आप उपयोग कर सकते हैं:

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

यह repetitionsतर्क निर्धारित करेगा कि आप कितनी बार यादृच्छिक रूप से विभिन्न समूह बनाते हैं। सबसे अच्छा असाइनमेंट - वह जो समूहों के बीच न्यूनतम अंतर है - वापस कर दिया जाएगा।


5

यद्यपि एलेक्स ए का जवाब प्रत्येक समूह के लिए समान संभावना देता है, लेकिन यह समूहों के लिए पंक्तियों की समान संख्या के लिए प्रश्न के अनुरोध को पूरा नहीं करता है। आर में:

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

3
स्वीकृत उत्तर की कमियों के बारे में आपका अवलोकन अच्छा है। हालांकि, आपका जवाब अभी भी उस सवाल के हिस्से को संबोधित नहीं करता है जो ब्याज का है (और केवल यही कारण है कि इसे यहां बंद नहीं किया गया था): आप प्रत्येक समूह में "मूल्य का समान वितरण, क्लिक गणना और रेटिंग विशेषताओं" को कैसे प्राप्त करते हैं? ?
whuber

क्या आप यहां इसका जवाब दे सकते हैं?
लेओ लेपोल्ड हर्ट्ज़ '

उत्तर "समान वितरण" का क्या अर्थ है, इस पर निर्भर होना चाहिए। ऐसा प्रतीत होता है कि प्रश्न चार चर पर आधारित क्लस्टर टिप्पणियों के लिए पूछ रहा है , प्रत्येक क्लस्टर में समान संख्या में अवलोकन हैं। ऐसा करने के लिए असंख्य तरीके हैं।
whuber

0

यह tidyr / dplyr का उपयोग करते हुए घोंसले के शिकार से हल किया जा सकता है

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.