मैं अपने डेटा को आर में बकेट करने के लिए "हिस्ट" फ़ंक्शन का उपयोग कर रहा हूं। अब मुझे क्या करना है एक हिस्ट फ़ंक्शन है जो न केवल मूल्यों की एक सूची को बाल्टी में लेता है, बल्कि प्रत्येक के लिए मूल्य और गिनती लेता है। मैंने इसे अपने लिए करने के लिए आर में एक लिखा है, लेकिन इसका 10-50x धीमा (बहुत मोटा अनुमान) अंतर्निहित हिस्ट से है।

क्या इसे 'मूल रूप से' करने का कोई तरीका है?

तो उदाहरण के लिए, शायद फॉर्म की एक सूची (या वेक्टर) (1, 200) (2, 30) (3, 50)

जहां पहला मान मान है, और दूसरा उस डेटा के उदाहरणों की संख्या है (मैं अपने डेटा को अन्य रूपों में स्थानांतरित कर सकता हूं, यह सिर्फ एक उदाहरण है)

धन्यवाद!

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

लेकिन अब मेरे पास 0 से 10 तक के मान का एक सेट नहीं है, बल्कि मूल्यों का एक सेट है, और इसके कितने उदाहरण हैं। इसलिए 0.1, 0.1, 0.1, 0.1, 0.2, 0.2, 0.5 को 7 अलग-अलग मानों के रूप में रखने के बजाय मेरे पास इसे (0.1, 4), (0.2, 2), (0.5, 1) के रूप में है जो मूल्यों को दर्शाता है और गिनती और मैं डेटा पर 'हिस्ट' फ़ंक्शन (या ऐसा कुछ) चलाने में सक्षम होना चाहता हूं और वही आउटपुट प्राप्त करना चाहता हूं जैसे कि यह 'विस्तारित' रूप में था।

तो मैंने ऐसा करने के लिए एक फ़ंक्शन लिखा है, लेकिन यह मूल इतिहास की तुलना में बहुत धीमी गति से चलता है। डेटा को "अनरोलिंग" करने से मुझे जो चाहिए वह स्मृति में बहुत बड़ा हो जाएगा।

r
0
UnknownGuy 4 जून 2011, 20:20
4
उत्तरों में विस्तृत श्रृंखला को देखते हुए, अब यह आपके प्रश्न को कुछ हद तक स्पष्ट करने में मदद कर सकता है ...
 – 
Ben Bolker
4 जून 2011, 21:31
मुझे लगता है कि आप एक भारित हिस्टोग्राम मांग रहे हैं लेकिन यह बताना मुश्किल है
 – 
hadley
4 जून 2011, 22:31
बस अपडेट किया गया, उम्मीद है कि मैंने स्पष्ट कर दिया है।
 – 
UnknownGuy
5 जून 2011, 11:02
तो मुझे लगता है कि मेरा समाधान वही है जो आप चाहते हैं? कृपया टिप्पणी करें यदि यह स्पष्ट नहीं है/नहीं है।
 – 
Ben Bolker
5 जून 2011, 23:50

4 जवाब

मुझे यकीन नहीं है कि "बकेटिंग डेटा" के तहत आपका क्या मतलब है, लेकिन अगर मैं सही हूं, तो आप hist फ़ंक्शन द्वारा बनाई गई श्रेणियां/ब्रेक प्राप्त करने और परिणामों को संग्रहीत करने के लिए तैयार हैं।

यह graphics को कॉल किए बिना आसानी से किया जा सकता है, जैसे:

> table(cut(data, 5))
(-0.000908,0.198]     (0.198,0.397]     (0.397,0.595]     (0.595,0.794] 
               19                20                17                21 
    (0.794,0.993] 
               23 

डेटा data <- runif(100) द्वारा प्रदर्शन उद्देश्यों के लिए बनाया गया था।

उपरोक्त आदेश में cut मुख्य कार्य करता है: यह निरंतर चर को अंतराल की निर्दिष्ट संख्या में काटता है (ऊपर: यह 5 था)। मैंने फ़्रीक्वेंसी दिखाने के लिए table को कॉल किया।

4
daroczig 4 जून 2011, 21:06
यह लगभग वही करता है जो मुझे चाहिए, लेकिन मेरा इनपुट डेटा (मान, गिनती) के रूप में है। तो मेरे पास हो सकता है ((0.2, 3), (0.1, 2), (0.6, 1)) वह रूप है जिसमें मेरे पास है, जो (0.2, 0.2, 0.2, 0.1, 0.1, 0.6) जैसा ही है। इसे 'लंबे' रूप में विस्तारित करना अनावश्यक लगता है।
 – 
UnknownGuy
6 जून 2011, 05:13

मुझे कुछ याद आ रहा है, लेकिन मुझे लगता है कि इससे मदद मिल सकती है:

#Generate the data
x <- c(rep(1, 200), rep(2, 30), rep(3, 50))

#Since the midpoints of each bucket will be used and the desired bucket width
#is 1, start the bucket breaks at -0.5
buc <- seq(-0.5, 5, 1)

#Get a histogram using the above bucket breaks
res <- hist(x, breaks=buc)

#Build a data frame with the results
df <- data.frame(mids=res$mids, counts=res$counts)
df

  mids counts
1    0      0
2    1    200
3    2     30
4    3     50
5    4      0

hist से कौन से वेरिएबल उपलब्ध हैं, यह देखने के लिए names का उपयोग करें

names(res)

[1] "breaks"      "counts"      "intensities" "density"     "mids"        "xname"       "equidist"  
1
bill_080 4 जून 2011, 21:26

अन्य उत्तरदाता के साथ, मुझे बिल्कुल यकीन नहीं है कि आप क्या चाहते हैं, लेकिन मैं अनुमान लगा रहा हूं कि आप एक बड़े वेक्टर के सारणीबद्ध विवरण का विस्तार चाहते हैं:

unlist( mapply("rep", x=c(1,2,3), times=c(200,30,50) ) )

  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [34] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [67] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[100] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[133] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[166] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[199] 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3
[232] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[265] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
0
IRTFM 5 जून 2011, 00:51
यह काम करेगा (सिवाय इसके कि मुझे लगता है कि मेरा डेटा बहुत बड़ा है), लेकिन ऐसा लगता है कि इसे विस्तारित करना आवश्यक नहीं होना चाहिए।
 – 
UnknownGuy
5 जून 2011, 11:04

क्या मतलब है आपका

barplot(height=c(200,30,50),names.arg=1:3,space=0,ylab="Count")

?

आप अपने डेटा को hist द्वारा दिए गए प्रारूप में हैक करके और graphics:::plot.histogram पर कॉल करके भी ऐसा कर सकते हैं, अर्थात।

## must specify counts, mid, breaks, and specify that the bars are equidistant
h <- list(counts=c(200,30,50),mid=1:3,breaks=seq(0.5,3.5,by=1),equidist=TRUE)
graphics:::plot.histogram(h,freq=TRUE)

संपादित करें: यह निर्भर करता है कि आपका डेटा किस रूप में है और आप कितना लचीला चाहते हैं री-बकेटिंग के बारे में होना।

एक कच्चा सरल संस्करण, यदि आप ब्रेक, मिडपॉइंट्स और काउंट्स का एक मौजूदा सेट लेना चाहते हैं, और agg डिब्बे (आपके उदाहरण में agg=2) के प्रत्येक सेट को एक साथ जोड़ना चाहते हैं:

mids <- seq(0.1,0.6,by=0.1)
breaks <- seq(0.05,0.65,by=0.1)
counts <- c(3,7,6,9,6,7)

agg <- 2
bnames <- apply(matrix(mids,byrow=TRUE,ncol=agg),1,
                      function(x) paste(head(x,1),tail(x,1),sep="-"))
bmids <- rowMeans(matrix(mids,byrow=TRUE,ncol=agg))
bbreaks <- breaks[seq(1,length(breaks),by=agg)]
bcount <- rowSums(matrix(counts,byrow=TRUE,ncol=agg))

h <- list(counts=bcount,mid=bmids,breaks=bbreaks,equidist=TRUE)
graphics:::plot.histogram(h,freq=TRUE)
0
Ben Bolker 6 जून 2011, 14:20
तो हाँ, यह इसे काउंट्स का उपयोग करके निकाल देगा, जो कि अच्छा है। लेकिन समस्या यह है कि मेरे पास इस तरह का डेटा हो सकता है (फॉर्म (मान, गिनती) में): ((0.1, 3), (0.2, 7), (0.3, 6), (0.4, 9), (0.5, 6) ), (0.6, 7))। इसलिए मैं अपने हिस्टोग्राम या बारप्लॉट में 6 अलग-अलग बार के रूप में गणना कर सकता था। लेकिन मैं इसे केवल 3 बार कहने में सक्षम होना चाहता हूं (इसलिए ब्रेक (0.1, 0.2], (0.2, 0.4], (0.4, 0.6)) का उपयोग करें। मैं उन गणनाओं को कैसे पुनर्गणना कर सकता हूं? क्या कोई अंतर्निहित है इसे करने का तरीका? मैंने इसे आर में करने के लिए लिखा है, लेकिन यह मूल हिस्ट फ़ंक्शन की तुलना में बहुत धीमा है (लेकिन यह वास्तव में बहुत अलग नहीं है)।
 – 
UnknownGuy
6 जून 2011, 05:19