У меня есть два фрейма данных: df1, предоставляющий координаты заданных символов, и df2, предоставляющий начальную и конечную координаты. Мне нужно получить последовательность символов между каждой начальной и конечной координатами в df2.
Например:
set.seed(1)
df1 <- data.frame(POS = 1:10000000,
REF = sample(c("A", "T", "G", "C"), 10000000, replace = T))
df2 <- data.frame(start = sample(1:5000000, 10, replace = T),
end = sample(5000001:10000000, 10, replace = T))
Я пытался использовать цикл for:
system.time( {
df2$seq <- NA
for(i in 1:nrow(coords)){
df2$seq[i] <- paste(ref$REF [ c( which(ref$POS == coords$start[i]) : which(ref$POS == coords$end[i]) ) ], collapse = "")
}
})
И с использованием ручной векторизации:
mongoose <- function(from, to){
string <- paste(
ref$REF [ c( which(ref$POS == from) : which(ref$POS == to) ) ],
collapse = "")
return(string)
}
mongoose_vec <- Vectorize(mongoose, vectorize.args = c("from", "to"))
system.time({
sequences <- mongoose_vec(from = df2$start, to = df2$end)
})
Однако оба эти метода работают с одинаковыми скоростями и недостаточно быстры, поскольку набор данных, к которому я их применяю, очень велик. У кого-нибудь есть предложения по улучшению производительности?