仅对间隔不在另一个 data.frame 内的那些行进行子集化
Subset only those rows whose intervals does not fall within another data.frame
我如何比较两个长度不等的数据帧(测试和控制),并根据三个标准从测试中删除该行,i) 如果 test$chr == control$chr
ii) test$start 和 test$end 位于 control$start 和 control$end 范围内
iii) test$CNA 和 control$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
当您说 "exclude the variable" 时,我假设您的意思是要删除满足这些条件的行。
如果是这样,你就快成功了。以下应该有效:
exclude_bool <- data1[,3] == data2[,3] &
data1[,4] > data2[,5] &
data1[,5] < data2[,4] &
data1[,6] == data2[,6]
data1 <- data1[!exclude_bool , ]
这是使用 data.table
中的 foverlaps()
的一种方法。
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
进行过滤。
我如何比较两个长度不等的数据帧(测试和控制),并根据三个标准从测试中删除该行,i) 如果 test$chr == control$chr ii) test$start 和 test$end 位于 control$start 和 control$end 范围内 iii) test$CNA 和 control$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
当您说 "exclude the variable" 时,我假设您的意思是要删除满足这些条件的行。
如果是这样,你就快成功了。以下应该有效:
exclude_bool <- data1[,3] == data2[,3] &
data1[,4] > data2[,5] &
data1[,5] < data2[,4] &
data1[,6] == data2[,6]
data1 <- data1[!exclude_bool , ]
这是使用 data.table
中的 foverlaps()
的一种方法。
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
进行过滤。