Chciałbym łączyć wiersze ramki danych tak, że zakresy opisane przez kolumnę "początek" i "koniec" obejmują wszystkie wartości z oryginalnego zestawu danych. Mogą występować nakładki, powtórzenia i zakresy zagnieżdżone. Może brakować niektórych zakresów.Skonsoliduj wiersze na podstawie zakresów dat
Oto przykład tego rodzaju danych Chciałbym zwinąć:
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))
pożądany wynik byłby:
name start end
Roger 1 17
Roger 20 25
Susan 2 8
Moja próba było rozwinąć każdy element w zakres dla każdego rzędu. To działa, ale nie jestem pewien, jak zmniejszyć to z powrotem. Dodatkowo pełny zestaw danych, z którym pracuję, ma ~ 30 milionów wierszy i bardzo duże zakresy, więc ta metoda jest BARDZO powolna.
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)
Może to oczywiste, ale dlaczego Roger pojawia się dwa razy? a nie w jednym wierszu z początkiem = 1 i końcem = 25? – snoram
@snoram Dobre pytanie. Ponieważ Roger nie miał 18 lub 19, więc te dwie zapisy odzwierciedlają lukę w jego zakresach. – Nancy
Powiązane: [collapse przecinające się regiony w R] (http://stackoverflow.com/questions/16957293/collapse-intersecting-regions-in-r) oraz [Merge Overlapping Ranges na unikalne grupy] (http://stackoverflow.com/questions/15235821/merge-overlapping-ranges-into-unique-groups) – Henrik