【发布时间】:2016-12-27 00:54:39
【问题描述】:
我想组合数据框的行,以便“开始”和“结束”列描述的范围包括原始数据集中的所有值。可能存在重叠、重复和嵌套范围。某些范围可能会丢失。
这是我想要折叠的数据类型的示例:
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 好问题。因为罗杰没有 18 或 19,所以这两条记录反映了他的范围差距。
标签: r date dataframe data.table