2015-07-20 3 views
0

Предположим, у меня есть кадр данных, который выглядит так.Обработка кадров данных 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")] 
+0

В последнем вопросе можно легко ответить 'mutate()' из пакета 'dplyr' - просто найдите учебник. Что касается первого вопроса, я не совсем уверен, что вы спрашиваете. Кроме того, я считаю, что вопросы, связанные с двойным баррелем, здесь неодобрительны. –

+0

Хм ... Я думаю, что это просто слишком широкие волосы для SO. Вы должны отредактировать вопрос, чтобы сосредоточиться на эффективности алгоритма вместо другого способа его выполнения. – VermillionAzure

ответ

3
Max_end <- 33 

breaks <- c(0, t(as.matrix(dat[,1:2])), Max_end) # get endpoints 
breaks <- breaks[breaks <= Max_end] 
merge(dat, data.frame(start=breaks[-length(breaks)], end=breaks[-1]), all=T) 

# start end motif 
# 1  0 2 <NA> 
# 2  2 6  a 
# 3  6 10 <NA> 
# 4 10 15  b 
# 5 15 30 <NA> 
# 6 30 33 <NA> 
# 7 30 35  c 

Чтобы указать начальную и конечную точки, вы могли бы сделать

Max_end <- 33 
Max_start <- 10 
breaks <- unique(c(Max_start, t(as.matrix(dat[,1:2])), Max_end)) 
breaks <- breaks[breaks <= Max_end & breaks >= Max_start] 

merge(dat, data.frame(start=breaks[-length(breaks)], end=breaks[-1]), all.y=T) 

# start end motif 
# 1 10 15  b 
# 2 15 30 <NA> 
# 3 30 33 <NA> 

Примечание: это не включает «c» в сокращенном конечном интервале, вам нужно будет решить, включены ли эти значения или нет, когда изменяется интервал.

+0

Я попытался сломать свой пост в два шага, чтобы лучше объяснить мой процесс. Однако я думаю, что это отвечает только на первую часть. У меня была большая проблема, упрощающая часть вычислений длин между начальным и конечным столбцами @nongkrong – ALKI

+0

Nevermind Я не видел комментария об использовании mutate(). Спасибо за помощь! – ALKI

+0

@Chani Для этого вы можете попробовать 'diff (t (yourResult [1: 2]))' также, 'yourResult' является данными после' merge' – jenesaisquoi