मेरे पास कई पंक्तियों के साथ एक डेटाटेबल है और मैं सशर्त रूप से दो स्तंभों, जैसे कि आरंभ और अंत समूह करना चाहता हूं। ये कॉलम एक निश्चित महीने के लिए खड़े हैं जिसमें संबंधित व्यक्ति कुछ कर रहा था। यहाँ कुछ नमूना डेटा है (आप में पढ़ने के लिए आर उपयोग कर सकते हैं, या नीचे आप आर का उपयोग न करता है, तो शुद्ध तालिकाओं लगता है):समूह लगातार श्रृंखला
# base:
test <- read.table(
text = "
1 A mnb USA prim 4 12
2 A mnb USA x 13 15
3 A mnb USA un 16 25
4 A mnb USA fdfds 1 2
5 B ghf CAN sdg 3 27
6 B ghf CAN hgh 28 29
7 B ghf CAN y 24 31
8 B ghf CAN ghf 38 42
",header=F)
library(data.table)
setDT(test)
names(test) <- c("row","Person","Name","Country","add info","Begin","End")
out <- read.table(
text = "
1 A mnb USA fdfds 1 2
2 A mnb USA - 4 25
3 B ghf CAN - 3 31
4 B ghf CAN ghf 38 42
",header=F)
setDT(out)
names(out) <- c("row","Person","Name","Country","add info","Begin","End")
समूह इस प्रकार से किया जाना चाहिए: व्यक्ति एक महीने 4 से लंबी पैदल यात्रा किया, तो 15 महीने तक और 16 महीने से 24 महीने तक यात्रा करते हुए, मैं लगातार 4 (या बिना ब्रेक के) गतिविधि 4 महीने से 24 महीने तक गतिविधि करता हूं। अगर बाद में व्यक्ति ए 25 से 28 महीने के महीने सर्फिंग करता है, तो मैं इसे भी जोड़ूंगा, और पूरी समूह गतिविधि 4 से 28 तक चली जाएगी। अब समस्याग्रस्त हैं मामले ओवरलैपिंग अवधि हैं, उदाहरण के लिए व्यक्ति ए 11 से 31 तक मछली पकड़ने भी कर सकता है, इसलिए पूरी चीज 4 से 31 हो जाएगी। हालांकि, अगर व्यक्ति ए 1 से 2 तक कुछ किया, यह एक अलग गतिविधि होगी (1 से 3 की तुलना में, जो भी होना चाहिए जोड़ा गया, क्योंकि 3 4 से जुड़ा हुआ है)। मुझे उम्मीद है कि यह स्पष्ट था, अगर नहीं, तो आप उपरोक्त कोड में और उदाहरण पा सकते हैं। मैं डेटाटेबल का उपयोग कर रहा हूं, क्योंकि मेरा डेटासेट काफी बड़ा है। मैंने अब तक sqldf के साथ शुरुआत की है, लेकिन यदि आपके पास प्रति व्यक्ति इतनी सारी गतिविधियां हैं (तो 8 या उससे अधिक कहें) यह समस्याग्रस्त है। क्या यह डेटाटेबल, या प्लीयर, या एसकल्डएफ में किया जा सकता है? कृपया ध्यान दें: मैं एसक्यूएल में एक उत्तर भी ढूंढ रहा हूं क्योंकि मैं इसे सीधे एसक्यूएलएफएफ में उपयोग कर सकता हूं या इसे किसी अन्य भाषा में बदलने की कोशिश करता हूं। sqldf समर्थन करता है (1) SQLite बैकएंड डेटाबेस (डिफ़ॉल्ट रूप से), (2) H2 जावा डेटाबेस, (3) PostgreSQL डेटाबेस और (4) sqldf 0.4-0 आगे भी MySQL का समर्थन करता है।
संपादित करें:
में:
Person Name Country add info Begin End
A mnb USA prim 4 12
A mnb USA x 13 15
A mnb USA un 16 25
A mnb USA fdfds 1 2
B ghf CAN sdg 3 27
B ghf CAN hgh 28 29
B ghf CAN y 24 31
B ghf CAN ghf 38 42
आउट: यहाँ 'शुद्ध' टेबल हैं
A mnb USA fdfds 1 2
A mnb USA - 4 25
B ghf CAN - 3 31
B ghf CAN ghf 38 42
इटज़िक बेन-गण द्वारा [पैकिंग अंतराल] (http://blogs.solidq.com/en/sqlserver/packing-intervals/) देखें। वह SQL सर्वर का उपयोग कर रहा है, लेकिन पोस्टग्रेज़ के नवीनतम संस्करण नवीनतम SQL सर्वर के रूप में समान विंडो फ़ंक्शन का समर्थन करते हैं, इसलिए पोस्टग्रेज़ में अपने SQL कोड को अनुकूलित करने के लिए यह छोटा होना चाहिए। विशेष रूप से, विंडो समग्र का उपयोग कर अंतिम समाधान 3 देखें। –
टा एक आर समाधान के लिए – user3032689
की जांच करेगा, [इस पोस्ट] (http://stackoverflow.com/questions/16957293/collapse-intersecting-regions-in-r) प्रासंगिक प्रतीत होता है। – Henrik