मैं डेटा फ्रेम की पंक्तियों को जोड़ना चाहता हूं जैसे "प्रारंभ" और "अंत" कॉलम द्वारा वर्णित श्रेणियों में मूल डेटा सेट के सभी मान शामिल हैं। ओवरलैप, दोहराने और घोंसला वाली श्रेणियां हो सकती हैं। कुछ श्रेणियां गायब हो सकती हैं।दिनांक सीमाओं के आधार पर पंक्तियों को समेकित करें
यहाँ जिस प्रकार का डेटा का एक उदाहरण मैं संक्षिप्त करने के लिए करना चाहते हैं क्या है:
data = data.frame(rbind(
c("Roger", 1, 10),
c("Roger", 10, 15),
c("Roger", 16, 17),
c("Roger", 3, 6),
c("Roger", 20, 25),
c("Roger", NA, NA),
c("Susan", 2, 8)))
names(data) = c("name", "start", "end")
data$start = as.numeric(as.character(data$start))
data$end = as.numeric(as.character(data$end))
वांछित परिणाम होगा:
name start end
Roger 1 17
Roger 20 25
Susan 2 8
मेरे प्रयास में हर आइटम बाहर का विस्तार करने में किया गया है प्रत्येक पंक्ति के लिए सीमा। यह काम करता है, लेकिन फिर मुझे यकीन नहीं है कि इसे वापस कैसे कम करें। इसके अतिरिक्त, जिन पूर्ण डेटासेट के साथ मैं काम कर रहा हूं उनमें ~ 30 मिलियन पंक्तियां और बहुत बड़ी श्रेणियां हैं, इसलिए यह विधि बहुत धीमी है।
pb <- txtProgressBar(min = 0, max = length(data$name), style = 3)
mylist = list()
for(i in 1:length(data$name)){
subdata = data[i,]
if(is.na(subdata$start)){
mylist[[i]] = subdata
mylist[[i]]$each = NA
}
if(!is.na(subdata$start)){
sequence = seq(subdata$start, subdata$end)
mylist[[i]] = subdata[rep(1, each = length(sequence)),]
mylist[[i]]$daily = sequence
}
setTxtProgressBar(pb, i)
}
rbindlist(mylist)
शायद यह स्पष्ट है लेकिन रोजर दो बार क्यों दिख रहा है? और शुरुआत = 1 और अंत = 25 के साथ एक पंक्ति में नहीं? – snoram
@snoram अच्छा सवाल। क्योंकि रोजर के पास 18 या 1 9 नहीं था, इसलिए दो रिकॉर्ड उनकी श्रेणियों में अंतर को दर्शाते हैं। – Nancy
संबंधित: [आर में क्षेत्रों को छेड़छाड़ करना] (http://stackoverflow.com/questions/16957293/collapse-intersecting-regions-in-r) और [अद्वितीय समूहों में ओवरलैपिंग रेंज मर्ज करें] (http://stackoverflow.com/प्रश्न/15235821/विलय-ओवरलैपिंग-श्रेणी-में-अद्वितीय-समूह) – Henrik