Подмножество только тех строк, чьи интервалы не попадают в другие 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 , ]