如何解决如何按R中的列值范围过滤行?
我有 2 个遗传数据集。一个定义每行基因组中的范围,另一个数据集是基因长度范围的行,我想确保与第一个数据集中的范围没有任何重叠。
例如,我的数据如下所示:
#df1:
Chromosome Min Max
1 10 500
1 450 550
2 20 100
2 900 1500
2 200 210
3 5 15
4 10 20
#df2:
Gene Gene.Start Gene.End Chromosome
Gene1 10 60 1
Gene2 950 990 1
Gene3 8 14 3
我想提取/选择 df2
中没有 Gene.Start
和 Gene.End
范围的行,其中范围内的任何内容都属于 df1
中给出的范围在 Min
和 Max
列中 - 重要的是,Chromosome
数字的考虑也必须匹配。
示例的预期输出如下所示:
Gene Gene.Start Gene.End Chromosome
Gene2 950 990 1
Gene2
是唯一一个具有起始和结束范围的基因/行,它不属于与 Chromosome
中匹配的 df1
(查看染色体 1 中的范围)的任何范围。
要对此进行编码,我正在尝试使用 data.table
,但我不确定如何像我希望的那样考虑范围。
我一直在努力让它发挥作用,但我不确定我在做什么:
df2[df1,match := i.Gene,on = .(Chromosome,(df2$Gene.Start > & < df2$Gene.End) > Min,(df2$Gene.Start > & < df2$Gene.End) < Max)]
Error: unexpected '&'
根据另一个数据帧中的范围,我该怎么做才能按其范围过滤数据帧?
示例输入数据:
df1 <- structure(list(Chromosome = c(1L,1L,2L,3L,4L),Min = c(10L,450L,20L,900L,200L,5L,10L),Max = c(500L,550L,100L,1500L,210L,15L,20L)),row.names = c(NA,-7L),class = c("data.table","data.frame"))
df2 <- structure(list(Gene = c("Gene1","Gene2","Gene3"),Gene.Start = c(10L,950L,8L),Gene.End = c(60L,990L,14L),Chromosome = c(1L,3L)),-3L),"data.frame"
))
解决方法
这是一个 data.table
方法
library(data.table)
# keep Gene that are not joined in the non-equi join on df1 below
df2[!Gene %in% df2[df1,on = .(Chromosome,Gene.Start >= Min,Gene.End <= Max)]$Gene,]
# Gene Gene.Start Gene.End Chromosome
# 1: Gene2 950 990 1
,
这是我对 dplyr
方法的尝试。请告诉我。
library(dplyr)
library(tidyr)
df2 %>%
right_join(df1,by = "Chromosome") %>%
filter(Gene.Start<Min | Gene.Start>Max,Gene.End>Max | Gene.End>Min) %>%
distinct(Gene,Gene.Start,Gene.End,Chromosome,.keep_all = TRUE) %>%
select(Gene,Chromosome)
输出:
Gene Gene.Start Gene.End Chromosome
1 Gene2 950 990 1
,
data.table
解决方案效果最好,因为它在我更大的真实数据上是最快的,但我最终还是用 GenomicRanges
找到了另一个解决方案,所以我想我也会分享给其他人以供将来参考:
library(GenomicRanges)
gr1 <- makeGRangesFromDataFrame(
data.frame(
chr=df1$Chromosome,start=df1$Min,end=df1$Max),keep.extra.columns=TRUE)
gr2 <- makeGRangesFromDataFrame(
data.frame(
chr=df2$Chromosome,start=df2$Gene.Start,end=df2$Gene.End,Gene = df2$Gene),keep.extra.columns=TRUE)
no_overlaps <- gr2[-queryHits(findOverlaps(gr2,gr1,type="any")),]
no_overlap_genes <- unique(no_overlaps$Gene)
gene_matches <- df2[Gene %in% no_overlap_genes]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。