Подмножество только тех строк, чьи интервалы не попадают в другие data.frame

Как я могу сравнить два фрейма данных (тестовый и контрольный) неравной длины и удалить строку из теста на основе трех критериев, i) если тест $chr == control$chr ii) test$start и test $ end лежит с в диапазоне контроля $ start и control $ end iii) тест $CNA и контроль $CNA одинаковы.

    test = 
        R_level  logp   chr start   end     CNA    Gene
        2     7.079     11  1159    1360    gain   Recl,Bcl
        11    2.4       12  6335    6345    loss   Pekg
        3     19        13  7180    7229    loss   Sox1

control =

  R_level    logp   chr  start  end     CNA    Gene
        2     5.9     11  1100  1400    gain   Recl,Bcl 
        2     3.46    11  1002  1345    gain    Trp1
        2     6.4     12  6705  6845    gain    Pekg
        4     7       13  6480  8129    loss    Sox1

Результат должен выглядеть примерно так

result =
     R_level     logp   chr start   end     CNA     Gene
          11      2.4    12  6335   6345    loss   Pekg

2 ответа

Решение

Вот один из способов использования foverlaps() от data.table,

require(data.table) # v1.9.4+
dt1 <- as.data.table(test)
dt2 <- as.data.table(control)
setkey(dt2, chr, CNA, start, end)

olaps = foverlaps(dt1, dt2, nomatch=0L, which=TRUE, type="within")
#    xid yid
# 1:   1   2
# 2:   3   4

dt1[!olaps$xid]
#    R_level logp chr start  end  CNA Gene
# 1:      11  2.4  12  6335 6345 loss Pekg

Читать ?foverlaps и посмотрите раздел примеров для получения дополнительной информации.

Кроме того, вы также можете использовать GenomicRanges пакет. Тем не менее, вам, возможно, придется фильтровать на основе CNA после объединения по перекрывающимся регионам (AFAICT).

Когда вы говорите "исключить переменную", я предполагаю, что вы хотите удалить строки, удовлетворяющие этим критериям.

Если это так, вы почти у цели. Следующее должно работать:

exclude_bool <- data1[,3] == data2[,3] &
data1[,4] > data2[,5] &
data1[,5] < data2[,4] &
data1[,6] == data2[,6] 

data1 <- data1[!exclude_bool , ]
Другие вопросы по тегам