"시작"및 "종료"열에 설명 된 범위에 원래 데이터 집합의 모든 값이 포함되도록 데이터 프레임의 행을 결합하고 싶습니다. 겹침, 반복 및 중첩 된 범위가있을 수 있습니다. 일부 범위가 누락되었을 수 있습니다.날짜 범위를 기준으로 행 통합
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
내 시도는 모든 항목을 확장하고있다 각 행의 범위. 이 방법은 효과가 있지만 그 후에 다시 축소하는 방법을 모르겠습니다. 또한, 내가 작업하고있는 전체 데이터 세트에는 3 천만 개의 행과 매우 큰 범위가 있으므로이 방법은 매우 느립니다.
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)
아마도 분명하지만 Roger가 두 번 나타나는 이유는 무엇입니까? start = 1 및 end = 25로 한 행에 없습니까? – snoram
@snoram 좋은 질문입니다. Roger는 18 세 또는 19 세가 아니기 때문에 두 기록은 자신의 범위에서 갭을 반영합니다. – Nancy
관련 항목 : [R의 교차 영역 축소] (http://stackoverflow.com/questions/16957293/collapse-intersecting-regions-in-r) 및 [고유 그룹으로의 중첩 범위] (http://stackoverflow.com)/questions/15235821/merge-overlapping-ranges-to-unique-groups) – Henrik