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"
))