Предположим, у меня есть кадр данных, который выглядит так.Обработка кадров данных R
# start end motif
# 2 6 a
# 10 15 b
# 30 35 c
Как создать кадр данных, который заполняет в остальных начальных и конечных местах, как так до определенного числа Max_end
:
Max_end <- 33
# start end motif
# 0 2 na # <- 0-2 are filled in because it is not in the original data frame
# 2 6 a # <- 2-6 are in the original
# 6 10 na # <- 6-10 is not
# 10 15 b # <- 10-15 is
# 15 30 na # and so on
# 30 33 c
И далее, вычисляет расстояние между началом и концом местоположения и создает кадр данных с одним столбцом.
# Length motif
# 2 na
# 4 a
# 4 na
# 5 b
# 15 na
# 3 c
В настоящее время это, как я делаю это: Это очень неэффективно
library(data.table)
library(stringi)
f <- fread('ABC.txt',header=F,skip=1)$V1
f <- paste(f, collapse = "")
motifs = c('GATC', 'CTGCAG', 'ACCACC', 'CC(A|T)GG', 'CCAC.{8}TGA(C|T)')
v <- na.omit(data.frame(do.call(rbind, lapply(stri_locate_all_regex(f, motifs), unlist))))
v <- v[order(v[,1]),]
v2difference <- "blah"
for(i in 2:nrow(v)){
if(v[i,1] > v[i-1,2]+2){v2difference[i] <- v[i,1]-v[i-1,2]-2}
}
v2difference[1] <- v[1,1]
v2 <- data.frame(Order=seq(1, 2*nrow(v), 2),Lengths=matrix(v2difference, ncol = 1),Motifs="na")
v1 <- data.frame(Order=seq(2, 2*nrow(v), 2),Lengths=(v$end-v$start+1),Motifs=na.omit(unlist(stri_extract_all_regex(f,motifs))))
V <- data.frame(Track=1,rbind(v1,v2))
V <- V[order(V$Order),]
B <- V[,!(names(V) %in% "Order")]
В последнем вопросе можно легко ответить 'mutate()' из пакета 'dplyr' - просто найдите учебник. Что касается первого вопроса, я не совсем уверен, что вы спрашиваете. Кроме того, я считаю, что вопросы, связанные с двойным баррелем, здесь неодобрительны. –
Хм ... Я думаю, что это просто слишком широкие волосы для SO. Вы должны отредактировать вопрос, чтобы сосредоточиться на эффективности алгоритма вместо другого способа его выполнения. – VermillionAzure