Ich möchte Zeilen eines Datenrahmens so kombinieren, dass die von einer Spalte "Anfang" und "Ende" beschriebenen Bereiche alle Werte aus dem ursprünglichen Datensatz enthalten. Es kann Überlappungen, Wiederholungen und verschachtelte Bereiche geben. Einige Bereiche fehlen möglicherweise.Konsolidieren Sie Zeilen basierend auf Datumsbereichen
Hier ist ein Beispiel für die Art von Daten, die ich zusammenbrechen mag:
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))
Das gewünschte Ergebnis wäre:
name start end
Roger 1 17
Roger 20 25
Susan 2 8
Mein Versuch, in der jedes Element zu erweitern heraus hat Bereich für jede Zeile. Das funktioniert, aber ich bin mir nicht sicher, wie ich es zurückschrauben soll. Darüber hinaus hat der gesamte Datensatz, mit dem ich arbeite, ungefähr 30 Millionen Zeilen und sehr große Bereiche, daher ist diese Methode SEHR langsam.
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)
Vielleicht ist es offensichtlich, aber warum erscheint Roger zweimal? und nicht in einer Reihe mit Start = 1 und Ende = 25? – snoram
@snoram Gute Frage. Da Roger keine 18 oder 19 hatte, spiegeln die beiden Aufzeichnungen die Lücke in seinen Reihen wider. – Nancy
Related: [Überschneidung Regionen in R] (http://stackoverflow.com/questions/16957293/collapse-intersecting-regions-in-r) und [Merge Overlapping Ranges in eindeutige Gruppen] (http://stackoverflow.com/questions/15235821/merge-overlaping-ranges-in-unique-groups) – Henrik