gpt4 book ai didi

r - 如何在R中按列值范围过滤行?

转载 作者:行者123 更新时间:2023-12-02 02:15:42 24 4
gpt4 key购买 nike

我有 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.StartGene.End 范围(其中任何内容)的行范围落在 MinMax 列中 df1 给出的范围内 - 重要的是,考虑了 Chromosome 数字也必须匹配。

示例的预期输出如下所示:

Gene   Gene.Start    Gene.End   Chromosome
Gene2 950 990 1

Gene2 是唯一具有起始和结束范围的基因/行,且不属于任何与 Chromosome 匹配的范围(查看染色体 1 中的范围) df1

为了对此进行编码,我正在尝试使用 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, 2L, 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, 1L,
3L)), row.names = c(NA, -3L), class = c("data.table", "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

关于r - 如何在R中按列值范围过滤行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67214948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com