2014-02-07 3 views
1

У меня есть fileA, в котором информация отображается интервалами - если для последовательных позиций присваивается одно и то же значение, эти последовательные значения перегруппируются в один интервал.Деконволюция интервалов в информации о местоположении

start  end  value label 
123  78000 0  romeo #value 0 at positions 123 to 77999 included. 
78000  78004 56  romeo #value 56 at positions 78000, 78001, 78002 and 78003. 
78004  78005 12  romeo #value 12 at position 78004. 
78006  78008 21  juliet #value 21 at positions 78006 and 78007. 
78008  78056 8  juliet #value 8 at positions 78008 to 78055 included. 

Промежутки Меня интересует отображаются в fileB:

start  end  label 
77998  78005 romeo 
78007  78012 juliet 

[EDIT] Этикетки в fileA были первоначально тянут в от fileB, так что можно с уверенностью предположить, что этикетки всегда эквивалентный для перекрывающихся интервалов.

Я пытаюсь извлечь информацию для всех отдельных позиций, соответствующих интервалам во втором файле, процесс, который я назову «деконволюцией» из-за отсутствия лучшего слова. Выход fileC должен придумать, как это:

position value label 
77998  0  romeo 
77999  0  romeo 
78000  56  romeo 
78001  56  romeo 
78002  56  romeo 
78003  56  romeo 
78004  12  romeo 
78007  21  juliet 
78008  8  juliet 
78009  8  juliet 
78010  8  juliet 
78011  8  juliet 

Это мой код:

#read from tab-delimited text files which do not contain column names 
A<-read.table("fileA.txt",sep="\t",colClasses=c("numeric","numeric","numeric","character")) 
B<-read.table("fileB.txt",sep="\t",colClasses=c("numeric","numeric","character")) 
#create empty table.frame for the output 
C <- data.frame (1,2,3) 
C <- C[-1,] 

#add column names 
colnames(A)<-c("start","end","value","label") 
colnames(B)<-c("start","end","label") 
colnames(C)<-c("position","value","label") 

#extract position information 
deconvolute <- function(x,y,z) { 
    for x$label %in% y$label { 
     #compute sequence of overlapping positions 
     overlap<-seq(max(x$start,y$start),x$end,1) 
     z$position<-overlap 
     #assign corresponding values to the other columns 
     z$value<-rep(x$value,length(overlap)) 
     z$label<-rep(x$label,length(overlap)) 
     } 
    } 

deconvolute(A,B,C) 

Я получаю много синтаксических ошибок в моей функции. Я был бы очень рад, если бы кто-то помог мне исправить их.

+0

Является ли ярлык в файле B важным? Я имею в виду: если бы у вас в файле B start = 78002, end = 78008 и label = romeo, что бы вы сделали? Или можно с уверенностью предположить, что метка всегда совпадает с интервалами в файле A? – nico

+0

Да, метка должна всегда соответствовать интервалам в файле A (у файла A изначально не было меток, они были извлечены из файла B с использованием другой части кода). добавив его в исходное сообщение – biohazard

ответ

1
# create sequence of positions 
s <- unlist(apply(B, MARGIN=1, FUN=function(x) seq(x[1], as.numeric(x[2])-1))) 
s 
[1] 77998 77999 78000 78001 78002 78003 78004 78007 78008 78009 78010 78011 

# matching between files A and B 

pos <- unlist(sapply(s, FUN=function(x) 
    which(
     apply(A, MARGIN=1, FUN=function(y) as.numeric(y[1])<=as.numeric(x) & as.numeric(x) < as.numeric(y[2]))) 
     )) 

# new dataframe 
deconvoluted <- data.frame(s, A$value[pos], A$label[pos]) 
deconvoluted 

     s A.value.pos. A.label.pos. 
1 77998   0  romeo 
2 77999   0  romeo 
3 78000   56  romeo 
4 78001   56  romeo 
5 78002   56  romeo 
6 78003   56  romeo 
7 78004   12  romeo 
8 78007   21  juliet 
9 78008   8  juliet 
10 78009   8  juliet 
11 78010   8  juliet 
12 78011   8  juliet 
+0

Ваше решение намного проще, чем мое. Нужна больше практики!: D – biohazard

+0

'pos' соответствует между кадрами данных' A' и 'B'. Это позиция строки в 'B', которая соответствует заданной строке в' A'. И это определено в строке 8 ('pos <- unliest (...') – Zbynek

+0

Извините, я понял, что сразу после запроса. Ваше решение дает мне ошибку. Я пытаюсь понять, почему: «Ошибка в data.frame (s, A $ value [pos], A $ label [pos]): Кадр данных различной длины из аргумента: 12, 0 (извините, я переводил это с японского, так что это может быть не точная оригинальная фраза на английском языке) – biohazard

Смежные вопросы