如何比较不等长度的两个数据帧(测试和控制),并根据三个标准从测试中删除行,i)如果测试$ chr == control $ chr ii)测试$ start和测试$ 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
答案 0 :(得分:1)
这是使用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
包。但是,您可能必须在重叠区域(AFAICT)合并后根据CNA
进行过滤。
答案 1 :(得分:0)
当您说“排除变量”时,我认为您的意思是要删除满足这些条件的行。
如果是这样,你几乎就在那里。以下应该有效:
exclude_bool <- data1[,3] == data2[,3] &
data1[,4] > data2[,5] &
data1[,5] < data2[,4] &
data1[,6] == data2[,6]
data1 <- data1[!exclude_bool , ]