Processando o arquivo de entrada com base na sobreposição de intervalo

Eu tenho um arquivo de entrada enorme (uma amostra representativa da qual é mostrada abaixo comoinput):

> input
           CT1           CT2           CT3
1 chr1:200-400  chr1:250-450  chr1:400-800
2 chr1:800-970  chr2:200-500  chr1:700-870
3 chr2:300-700 chr2:600-1000 chr2:700-1400

Quero processá-lo seguindo algumas regras (descritas abaixo) para obter umaoutput gostar:

 > output
              CT1 CT2 CT3
chr1:200-400    1   1   0
chr1:800-970    1   0   0
chr2:300-700    1   1   0
chr1:250-450    1   1   0
chr2:200-500    1   1   0
chr2:600-1000   0   1   1
chr1:400-800    0   0   1
chr1:700-870    0   1   1
chr2:700-1400   0   1   1

Regras: Pegue todos os índices (o primeiro nesse caso échr1:200-400), veja se ele se sobrepõe significativamente aos valores em outra coluna. Significativamente, quero dizer pelo menos 50% de sobreposição do intervalo. Se sim, escreva1 abaixo da coluna em que existe, se não gravar0.

Agora eu explico como consegui a tabela de saída. De nossa entrada, usamos a primeira entrada de índice [1,1], que échr1:200-400. Como existe na coluna 1, escreveremos 1 abaixo dela. Agora vamos verificar se esse ou um intervalo sobreposto existe em qualquer outra coluna. Esse valor se sobrepõe apenas ao primeiro valor (chr1:250-450) da segunda coluna (CT2) Agora verificamos se essa sobreposição é significativa ou não. Sabemos que o intervalo é 200 (chr1: 200-400), a sobreposição com o valor da 2ª coluna (que é chr1: 250-450) é150 (250-400). Como essa sobreposição de 150 é maior que a metade (50% da faixa original = 100) da faixa original (200-400 = 200)OU intervalo sobreposto (250-450 = 200). Consideramos uma sobreposição e atribuímos 1 abaixo da coluna CT2 também. Como esse intervalo não se sobrepõe a nenhum valor emCT3, escrevemos 0 abaixoCT3. Da mesma forma para a linha 9 da saída.chr2:700-1400 não existe emCT1 então escreva 0 abaixo dele. ParaCT2 sobrepõe-se achr2:600-1000. O intervalo original aqui é 700 (chr2: 700-1400), metade dele é 350. A sobreposição comchr2:700-1000 doCT2 é 300 (fora do intervalo real chr2: 600-1000). Agora, essa sobreposição de 300 não é maior que a metade do intervalo real 700 (chr2: 700-1400 do CT3), mas é maior que a metade do intervalo sobreposto 400 (chr2: 600-1000 do CT2). Portanto, consideramos uma sobreposição e escrevemos 1 abaixo de CT2. Como esse intervalo realmente existe no CT3, também escrevemos 1 abaixo dele.

Aqui estão os dados de entrada e saída:

> dput(input)
structure(list(CT1 = structure(1:3, .Label = c("chr1:200-400", 
"chr1:800-970", "chr2:300-700"), class = "factor"), CT2 = structure(1:3, .Label = c("chr1:250-450", 
"chr2:200-500", "chr2:600-1000"), class = "factor"), CT3 = structure(1:3, .Label = c("chr1:400-800", 
"chr1:700-870", "chr2:700-1400"), class = "factor")), .Names = c("CT1", 
"CT2", "CT3"), class = "data.frame", row.names = c(NA, -3L))
> dput(output)
structure(list(CT1 = c(1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L), CT2 = c(1L, 
0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L), CT3 = c(0L, 0L, 0L, 0L, 0L, 
1L, 1L, 1L, 1L)), .Names = c("CT1", "CT2", "CT3"), class = "data.frame", row.names = c("chr1:200-400", 
"chr1:800-970", "chr2:300-700", "chr1:250-450", "chr2:200-500", 
"chr2:600-1000", "chr1:400-800", "chr1:700-870", "chr2:700-1400"
))

questionAnswers(1)

yourAnswerToTheQuestion