функция.

я есть огромный входной файл (типичный образец которого показан ниже как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"
))

Ответы на вопрос(1)

Ваш ответ на вопрос