У меня есть две таблицы данных, например:
dt1 <- data.table(ID1 = c("A", "B", "C", "D", "E"),
start1 = c(100, 1, 210, 300, 400),
end1 = c(200, 90, 240, 380, 500))
dt2 <- data.table(ID2 = c("a1", "a2", "a3", "a4", "a5", "a6"),
start2 = c(10, 150, 300, 310, 350, 400),
end2 = c(50, 100, 250, 280, 390, 450))
И я пытаюсь объединить их, основываясь на том, имеют ли они перекрывающиеся последовательности. Например, желаемый вывод:
output <- data.table(ID1 = c("A", "B", "D", "D", "D", "E"),
start1 = c(100, 1, 300, 300, 300, 400),
end1 = c(200, 90, 380, 380, 380, 500),
ID2 = c("a2", "a1", "a3", "a4", "a5", "a6"),
start2 = c(150, 10, 300, 310, 350, 400),
end2 = c(100, 50, 250, 280, 390, 450))
Я могу сделать это в цикле for. Например:
ID1_list <- list() # set output lists
ID2_list <- list()
for (i in 1:nrow(dt1)){
vec1 <- seq(from = dt1$start1[i], to = dt1$end1[i])
ID1_vec <- rep(dt1$ID1, each = nrow(dt2)) # set output vectors
ID2_vec <- rep(NA, nrow(dt2))
for (j in 1:nrow(dt2)){
vec2 <- seq(from = dt2$start[j], to = dt2$end[j])
if (length(intersect(vec2, vec1)) > 0){
ID2_vec[j] <- dt2$ID2[j]
}
}
ID1_list[[i]] <- ID1_vec
ID2_list[[i]] <- ID2_vec
}
output2 <- data.table(ID1 = unlist(ID1_list),
ID2 = unlist(ID2_list))
output2 <- output2[complete.cases(output2),]
output2 <- merge(dt1, unique(output2))
output2 <- merge(output2, dt2, by = "ID2")
Однако таблицы данных, к которым я применяю это, очень велики и этот метод слишком медленный. У кого-нибудь есть предложения по улучшению производительности?