2013-08-16 10 views
5

मैं एक डेटा फ्रेम में साल के रन खोजने की कोशिश कर रहा हूँ (आदर्श का उपयोग कर plyr)ढूँढना संख्या

के रन में पर्वतमाला मैं इस से प्राप्त करना चाहते हैं:

require(plyr) 

dat<-data.frame(
    name=c(rep("A", 11), rep("B", 11)), 
    year=c(2000:2010, 2000:2005, 2007:2011) 
) 
इस के लिए

:

ddply(dat, .(name), summarise, 
     continuous=(max(year)-min(year))+1==length(year)) 
:

out<-data.frame(
    name=c("A", "B", "B"), 
    range=c("2000-2010", "2000-2005", "2007-2011")) 

यह है कि क्या प्रत्येक समूह साल की एक सतत रन है की पहचान करने के लिए पर्याप्त आसान है

मैं समूह "बी" को दो श्रेणियों में तोड़ने के बारे में कैसे जा सकता हूं?

किसी भी विचार या रणनीति की वास्तव में सराहना की जाएगी।

धन्यवाद

उत्तर

7

आप "plyr" से या आधार आर से एक समारोह का उपयोग करें, आपको पहले कुछ समूहों की स्थापना के लिए की जरूरत है। आपके वर्षों के अनुक्रमिक होने के बाद समूहों में परिवर्तन का पता लगाने का एक तरीका यह है कि diff के बराबर नहीं है। diff इनपुट वेक्टर से कम लंबाई का वेक्टर बनाता है, इसलिए हम इसे "1" के साथ शुरू करेंगे और ले लेंगे परिणाम के cumsum

व्यवहार में एक व्याख्या की है कि कौर लाना है, तो आप कुछ इस तरह की कोशिश कर सकते हैं:

dat$id2 <- cumsum(c(1, diff(dat$year) != 1)) 

यहां से, आप aggregate या अपने पसंदीदा समूहीकरण समारोह का उपयोग कर सकते उत्पादन आप देख रहे हैं पाने के लिए।

aggregate(year ~ name + id2, dat, function(x) paste(min(x), max(x), sep = "-")) 
# name id2  year 
# 1 A 1 2000-2010 
# 2 B 2 2000-2005 
# 3 B 3 2007-2011 

aggregate साथ range का उपयोग करने के लिए, आप के रूप में नीचे collapse को sep को बदलने की आवश्यकता: मेरे अपने सींग tooting

aggregate(year ~ name + id2, dat, function(x) paste(range(x), collapse = "-")) 
+1

+1 बहुत अच्छा समाधान है। –

+0

बहुत बढ़िया - मैंने कभी इसके बारे में सोचा नहीं होगा। प्लीयर के लिए मैं इसे ddply (डेटा,। (नाम, आईडी 2), संक्षेप में, पेस्ट (न्यूनतम (वर्ष), ":", अधिकतम (वर्ष), sep = "") के साथ समाप्त कर सकता हूं। –

+0

@EdG या 'ddply (डेटा," id2 ", संक्षेप, रेंज = पेस्ट (रेंज (वर्ष), पतन =" - "))' –

2

, cgwtools::seqle विभाजन की पहचान के लिए इस्तेमाल किया जा सकता। एक पाश या *applynames तत्वों से अधिक चलाएँ, और प्रत्येक मामले के लिए,

foo <- seqle(dat$year, incr=1) 

फिर length(foo$lengths) आप समूहों की संख्या दे देंगे, और साल की सीमा को आसानी से foo$values से फिर से बनाया गया।

yeargroups <- sapply(length(foo$lengths), function(x) c(foo$values[x],(foo$values[x]+foo$lengths[x]-1))) 

बस मामले में किसी को इस प्रस्ताव विभिन्न मापदंडों या वांछित उप-विभाजन वाले एक ऐसी ही स्थिति है।

+0

+1। मैं इसका जिक्र करने जा रहा था, लेकिन मैंने सोचा कि मैं आपको अपना पैकेज दिखाने का मौका दूंगा :) – A5C1D2H2I1M1N2O1R2T1

संबंधित मुद्दे