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