我想合併數據框的行,使「開始」和「結束」列所描述的範圍包含原始數據集的所有值。可能有重疊,重複和嵌套範圍。一些範圍可能會丟失。根據日期範圍合併行
這是我想崩潰的數據類型的例子:
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
我的嘗試是每個項目中展開了範圍爲每行。這有效,但我不知道如何縮小它。另外,我正在使用的完整數據集有大約3000萬行和非常大的範圍,所以這種方法非常慢。
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)
也許這很明顯,但爲什麼羅傑出現兩次?而不是在start = 1和end = 25的行中。 – snoram
@snoram好問題。因爲羅傑沒有18或19,所以這兩個記錄反映了他的範圍內的差距。 – Nancy
相關:[在R中摺疊相交區域](http://stackoverflow.com/questions/16957293/collapse-intersecting-regions-in-r)和[合併重疊範圍到唯一組中](http://stackoverflow.com/questions/15235821/merge-overlapping-ranges-into-unique-groups) – Henrik