मान लीजिए आप एक नंबर लाइन पर था शुरू = 3, अंत = 7, और आप एक '1' के रूप में प्रत्येक चिह्नित था: मेरी मशीन पर 1 लाख पंक्तियों की एक इनपुट मैट्रिक्स को चलाने के लिए ~ 5 सेकंड लेता है 1
starts: 0 0 1 0 0 0 0 0 0 ...
ends + 1: 0 0 0 0 0 0 0 1 0 ...
शुरू होता है शून्य से समाप्त होता है के संचयी योग, और दोनों के बीच अंतर के संचयी योग पर शुरू,
cumsum(starts): 0 0 1 1 1 1 1 1 1 ...
cumsum(ends + 1): 0 0 0 0 0 0 0 1 1 ...
diff: 0 0 1 1 1 1 1 0 0
है और diff में 1 के स्थानों
हैं
which(diff > 0): 3 4 5 6 7
उपयोग सारणीबद्ध कई शुरू होता है के लिए अनुमति देने के लिए/एक ही स्थान पर समाप्त होता है, और
range2 <- function(ranges)
{
max <- max(ranges)
starts <- tabulate(ranges[,1], max)
ends <- tabulate(ranges[,2] + 1L, max)
which(cumsum(starts) - cumsum(ends) > 0L)
}
प्रश्न के लिए, यह देता है
> eg <- matrix(c(1, 3, 10, 5, 6, 13), 3)
> range2(eg)
[1] 1 2 3 4 5 6 10 11 12 13
यह Andrie के उदाहरण
के लिए, बहुत तेजी से है
> system.time(runs <- range2(xx))
user system elapsed
0.108 0.000 0.111
(यह डीएनए सेक की तरह थोड़ा लगता है एनसी विश्लेषण, जिसके लिए GenomicRanges आपका मित्र हो सकता है; आप पढ़ने पर coverage
और slice
फ़ंक्शंस का उपयोग करेंगे, शायद readGappedAlignments
के साथ इनपुट करें)।
मुझे लगता है कि ओपी चाहता है कि नतीजा केवल एक बार पूर्णांक को प्रदर्शित करे। – seancarmody
मैंने समय की तुलना की है: मेरा जवाब निश्चित रूप से चलाने के लिए धीमा है! – seancarmody
@seancarmody ** अद्वितीय ** पूर्णांक के लिए आवश्यकता को हाइलाइट करने के लिए धन्यवाद। मैं अपना जवाब संपादित करूंगा। – Andrie