Procesando el archivo de entrada basado en la superposición de rango

Tengo un gran archivo de entrada (una muestra representativa de la cual se muestra a continuación 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

Quiero procesarlo siguiendo algunas reglas (que se describen a continuación) para obtener unoutput me gusta:

 > 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

Reglas: Tome cada índice (el primero en este caso eschr1:200-400), vea si se superpone significativamente con los valores en otra columna. Por significativamente me refiero al menos al 50% de superposición del rango. Si es así, escribe1 debajo de esa columna en la que existe, si no escribe0.

Ahora explico cómo obtuve la tabla de salida. De nuestra entrada tomamos la primera entrada de índice [1,1] que eschr1:200-400. Como existe en la columna 1, escribiremos 1 debajo. Ahora comprobaremos si este o un rango superpuesto existe en cualquier otra columna. Este valor se superpone solo con el primer valor (chr1:250-450) de la segunda columna (CT2) Ahora verificamos si esta superposición es significativa o no. Sabemos que el rango es 200 (chr1: 200-400), la superposición con el valor de la segunda columna (que es chr1: 250-450) es150 (250-400). Como esta superposición de 150 es mayor que la mitad (50% del rango original = 100) del rango original (200-400 = 200)O rango superpuesto (250-450 = 200). Consideramos que se superpone y asignamos 1 debajo de la columna CT2 también. Como este rango no se superpone con ningún valor enCT3, escribimos 0 a continuaciónCT3. Del mismo modo para la fila 9 de salida.chr2:700-1400 no existe enCT1 así que escribe 0 debajo. porCT2 se superpone conchr2:600-1000. El rango original aquí es 700 (chr2: 700-1400), la mitad es 350. La superposición conchr2:700-1000 deCT2 es 300 (fuera del rango real chr2: 600-1000). Ahora, esta superposición de 300 no es mayor que la mitad del rango real 700 (chr2: 700-1400 de CT3) pero es mayor que la mitad del rango de superposición 400 (chr2: 600-1000 de CT2). Por lo tanto, lo consideramos una superposición y escribimos 1 debajo de CT2. Como este rango realmente existe en CT3, también escribimos 1 debajo.

Aquí están las entradas y salidas de entrada:

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta