Как получить строки о том, что один столбец одинаков, а другой столбец сходен между кадрами данных? - PullRequest
0 голосов
/ 11 июня 2018

У меня много больших фреймов данных.Я хочу, чтобы первый столбец был одинаковым, а разница второго столбца - менее 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, ]

Но это слишком медленно и плохая эффективность.Я надеюсь получить лучший способ.Заранее спасибо!

1 Ответ

0 голосов
/ 11 июня 2018
library(data.table)

Создать a и b

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

Присоединитьсяметод, требующий добавления дополнительных столбцов (тот же вывод)

Добавление границ для рассмотрения pos "аналог"

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

Соединение b с a в соответствии сэти границы.

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
")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...