【问题标题】:How to get the rows that one column is same and another column is similar between dataframe?如何在数据框之间获取一列相同且另一列相似的行?
【发布时间】:2018-06-11 14:47:22
【问题描述】:

我有很多大型数据框。我想让第一列相同,第二列的差异在两个数据帧之间小于 5000。 如:

>a
chr  pos
chr2 10000
chr2 20000
chr2 45000
chr2 60000
chr2 80000
chr2 100000

>b
chr  pos
chr2 10000
chr2 30000
chr2 40000
chr2 55000
chr2 80000

我的预期结果:

>c
chr  pos
chr2 10000
chr2 45000
chr2 60000
chr2 80000

我试过了:

c<-data.frame(chr=0, pos=0)
for (i in 1:nrow(b)) {
    c1<-a[(a$chr %in% b[i, 1]) & abs(a$pos-b[i, 2])<=5000, ]
    c<-rbind(c, c1)
  }
c<-c[-1, ]

但它太慢而且效率太低。 我希望能有更好的方法。 提前感谢!

【问题讨论】:

    标签: r


    【解决方案1】:
    library(data.table)
    

    创建ab

    a <- fread("
    chr  pos
    chr2 10000
    chr2 20000
    chr2 45000
    chr2 60000
    chr2 80000
    chr2 100000
    ", data.table = F)
    
    b <- fread("
    chr  pos
    chr2 10000
    chr2 30000
    chr2 40000
    chr2 55000
    chr2 80000
    ", data.table = F)
    
    setDT(a)
    setDT(b)
    

    @Jaap 方法,不需要额外的列

    a[pos %inrange% b[, .(low = pos - 5000, high = pos + 5000)] & match(chr, b$chr)]
    #     chr   pos
    # 1: chr2 10000
    # 2: chr2 45000
    # 3: chr2 60000
    # 4: chr2 80000
    

    Join 方法,需要添加额外的列(相同的输出)

    添加考虑pos“相似”的界限

    a[, `:=`(low = pos - 5000, high = pos + 5000)]
    

    根据这些界限将ba 连接起来。

    b[a, .(chr, pos), on = .(pos >= low, pos <= high, chr = chr), nomatch = 0]
    

    SQL 方法,不需要额外的列(相同的输出)

    library(sqldf)
    
    sqldf("
    select  a.*
    from    a
            inner join b 
              on  a.chr = b.chr
                  and b.pos between a.pos - 5000 and a.pos + 5000
    ")
    

    【讨论】:

    • data.table 的另一种可能性:a[pos %inrange% b[, .(low = pos - 5000, high = pos + 5000)] &amp; match(chr, b$chr)]
    • @Jaap 你是对的sqldf 输出,我现在已经修复了。是的,这看起来是一个更好的data.table 选项。随意添加作为答案。
    • 不确定它是否真的更好。随意包含它,它的灵感来自我发布的 previous answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多