如何根据R中另一个文件的条件从文件中提取

如何根据R中另一个文件的条件从文件中提取,r,data.table,bioinformatics,R,Data.table,Bioinformatics,我有两个基因数据集。我根据文件2中的两列筛选文件1。文件1行提取的条件是,对于文件2中相同染色体上的变体,仅选择染色体位置大于5000或小于5000的行。因此,作为条件的列是染色体位置(Position)和染色体(Chrom)。例如,我的数据如下所示: 文件1: Variant Chrom Position Variant1 2 14000 Variant2 1 9000

我有两个基因数据集。我根据文件2中的两列筛选文件1。文件1行提取的条件是,对于文件2中相同染色体上的变体,仅选择染色体位置大于5000或小于5000的行。因此,作为条件的列是染色体位置(Position)和染色体(Chrom)。例如,我的数据如下所示:

文件1:

Variant      Chrom         Position  
Variant1      2            14000     
Variant2      1            9000              
Variant3      8            37000          
Variant4      1            21000    
文件2:

Variant      Chrom         Position  
Variant1      1            10000                   
Variant2      1            20000                   
Variant3      8            30000      
预期输出(与同一染色体上文件2的任何行相比,位置距离大于+/-5000的变体):

我根据对上一个问题()的回答来编写代码。但是,使用我提供的示例数据,该代码的输出仅查找1/2个变体。我还试图执行一个概念验证测试,以证明此代码确实正确运行,而且看起来也不正确

代码如下:

library(data.table)
dt1<-fread("file1.txt")  
dt2<-fread("file2.txt")   

dt2[, c("low", "high") := .(position - 5000, position  + 5000)]

#find matches on chromosome, with position between low&high
dt1[ dt2, match := i.Variant,
     on = .(chrom, position > low, position < high ) ]

#discard all found matches (match != NA ), and then drop the match-column
df <- dt1[ is.na(match) ][, match := NULL ][]   
fwrite(df, "file3.csv") 
为了进一步检查此代码,我尝试通过反转此代码中的
低,位置<高)]
测试1(高)]

test2如果您将代码更改为以下内容,它将提供以下结果:

    Variant Chrom Position
1: Variant1     2    14000
2: Variant3     8    37000
代码:

库(data.table)

dt1如果您将代码更改为以下内容,它将提供以下结果:

    Variant Chrom Position
1: Variant1     2    14000
2: Variant3     8    37000
代码:

库(data.table)

dt1只要记住将色度和位置大写,就可以正常工作。我投票决定以打字错误结束。谢谢你指出这一点,我现在已经解决了。但是,我的测试代码在更改
后仍然会输出相同2个变体的匹配结果,这有什么原因吗?只要记住将色度和位置大写,就可以了。我投票决定以打字错误结束。谢谢你指出这一点,我现在已经解决了。但是,我的测试代码在更改
后仍然会输出相同2个变体的匹配结果,这有什么原因吗?谢谢。我看它现在能用了。但是,尽管更改了
,我的测试代码仍然输出匹配结果。您知道为什么会出现这种情况吗?代码可以工作,并将提供正确的结果,但您需要在测试之前使用
rm()导入数据
dt
上,或使用
rm(list=ls())
擦除内存。您的匹配信息存储在提供相同结果的每个
dt
中。擦除内存后,您应该会得到预期的结果,并使用
fread()
重新加载数据。谢谢。我看它现在能用了。但是,尽管更改了
,我的测试代码仍然输出匹配结果。您知道为什么会出现这种情况吗?代码可以工作,并将提供正确的结果,但您需要在测试之前使用
rm()导入数据
dt
上,或使用
rm(list=ls())
擦除内存。您的匹配信息存储在提供相同结果的每个
dt
中。擦除内存后,您应该会得到预期的结果,并使用
fread()
重新加载数据。
dt1[ dt2, match := i.Variant,
     on = .(Chrom, Position > low, Position < high ) ]
test1 <- dt1[ is.na(match) ][, match := NULL ][]

dt1[ dt2, match := i.Variant,
     on = .(Chrom, Position < low, Position > high ) ]
test2 <-  dt1[ is.na(match) ][, match := NULL ][]

    Variant Chrom Position
1: Variant1     2    14000
2: Variant3     8    37000
library(data.table)
dt1 <- fread("file1.txt")
dt2 <- fread("file2.txt")

dt2[, c("low", "high") := .(Position - 5000, Position + 5000)]
dt1[ dt2, match := i.Variant, on = .(Chrom, Position > low, Position < high)]
df <- dt1[ is.na(match) ][, match := NULL ][]

fwrite(df, "file3.csv")