функция.
я есть огромный входной файл (типичный образец которого показан ниже какinput
):
> 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
Я хочу обработать его, следуя некоторым правилам (описанным ниже), чтобы получитьoutput
любить:
> 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
Правила: Возьмите каждый индекс (первый в этом случаеchr1:200-400
), посмотрите, значительно ли он перекрывается со значениями в другом столбце. Из значимого я имею в виду, по крайней мере, 50% перекрытия диапазона. Если да, напишите1
ниже того столбца, в котором он существует, если не написать0
.
Теперь я объясню, как я получил выходную таблицу. Из нашего ввода мы берем 1-й индексный вход [1,1], которыйchr1:200-400
, Так как он существует в столбце 1, мы напишем 1 ниже. Теперь мы проверим, существует ли этот или перекрывающийся диапазон в любом другом столбце. Это значение перекрывается только с первым значением (chr1:250-450
) второго столбца (CT2
). Теперь мы проверяем, является ли это перекрытие значительным или нет. Мы знаем, что диапазон равен 200 (chr1: 200-400), перекрытие со значением 2-го столбца (которое составляет chr1: 250-450)150 (250-400). Поскольку это перекрытие 150 больше половины (50% исходного диапазона = 100) исходного диапазона (200-400 = 200)ИЛИ ЖЕ диапазон перекрытия (250-450 = 200). Мы считаем это перекрытием и присваиваем 1 ниже столбца CT2. Поскольку этот диапазон не перекрывается с любым значением вCT3
мы пишем 0 нижеCT3
, Аналогично для строки 9 вывода.chr2:700-1400
не существует вCT1
поэтому напишите 0 ниже. ЗаCT2
это совпадает сchr2:600-1000
, Оригинальный диапазон здесь составляет 700 (chr2: 700-1400), половина из них составляет 350. Перекрытие сchr2:700-1000
изCT2
составляет 300 (вне фактического диапазона chr2: 600-1000). Теперь это перекрытие 300 не больше половины фактического диапазона 700 (chr2: 700-1400 для CT3), но оно больше половины диапазона 400 перекрытия (chr2: 600-1000 для CT2). Поэтому мы считаем это перекрытием и пишем 1 ниже CT2. Поскольку этот диапазон фактически существует в CT3, мы также пишем 1 ниже.
Вот данные ввода и вывода:
> 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"
))