R: Попытка подсчитать количество валют в одном кадре данных на основе позиций другого кадра данных. - PullRequest
3 голосов
/ 25 октября 2019

У меня есть два фрейма данных, X и Y.

X <- data.frame(V1 = c("chr1", "chr1", "chr1", "chr2", "chr2", "ch2"),
                Start = c(0, 540, 920, 0, 582, 715 ),
                Stop = c(230, 720, 1270, 350, 635, 950))

Y <- data.frame(V1 = c("chr1", "chr1", "chr1", "chr2", "chr2", "ch2"),
                Start = c(3, 16, 180,
                          15, 585, 800 ),
                Stop = c(15, 24, 201,
                         102, 612, 850))

Я хочу получить data.frame Z, который является новым data.frame с информацией X и количество Y между диапазоном каждой строки "X". Например, вы можете сосчитать 3 строки "Y", которые находятся между диапазонами первой строки "X" в chr1, поэтому у меня есть 3 в "Z" в этой строке.

Z <- data.frame(V1 = c("chr1", "chr1", "chr2", "chr2", "chr2", "ch2"),
                Start = c(0, 540, 920, 0, 582, 715 ),
                Stop = c(230, 720, 1270, 350, 635, 950),
                Count = c(3, 0, 0, 1, 1, 1))

Я был бы признателен за некоторую помощь, потому что до сегодняшнего дня мне удавалось печатать только количество строк, если в наборе данных «X» есть только одна строка, но я не знаю, как достичь своей цели. Я предполагаю, что мне нужно использовать некоторые условные операторы плюс цикл for для итерации по строкам «X», но я не знаю, как это сделать.

Что я пробовал:

  1. Попытка вычислить количество строк, соответствующих критериям только с одной строкой в ​​"Y":

    nrow(Y[Y$Start >= X$Start & Y$Stop <= X$Stop, ])

Работает, когдав «X» есть только 1 строка, но не тогда, когда я пытался реализовать ее в цикле for.

Ответы [ 2 ]

3 голосов
/ 25 октября 2019

Поскольку вы упомянули, что вы биоинформатик, я хотел бы указать вам на Bioconductor и пакет GenomicRanges, созданный специально для этого типа проблем.

library(GenomicRanges)
X <- data.frame(V1 = c("chr1", "chr1", "chr1", "chr2", "chr2", "ch2"),
                Start = c(0, 540, 920, 0, 582, 715 ),
                Stop = c(230, 720, 1270, 350, 635, 950))

Y <- data.frame(V1 = c("chr1", "chr1", "chr1", "chr2", "chr2", "ch2"),
                Start = c(3, 16, 180,
                          15, 585, 800 ),
                Stop = c(15, 24, 201,
                         102, 612, 850))


x <- GRanges(X$V1, ranges = IRanges(X$Start, X$Stop))
y <- GRanges(Y$V1, ranges = IRanges(Y$Start, Y$Stop))

countOverlaps(x, y)
z <- GRanges(x, count = countOverlaps(x, y))
as.data.frame(z)
#  seqnames start  end width strand count
#1     chr1     0  230   231      *     3
#2     chr1   540  720   181      *     0
#3     chr1   920 1270   351      *     0
#4     chr2     0  350   351      *     1
#5     chr2   582  635    54      *     1
#6      ch2   715  950   236      *     1
3 голосов
/ 25 октября 2019

вы можете сделать это, используя пакет tidyverse.

Сначала я бы порекомендовал выбрать вариант stringsAsFactors = FALSE.

X <- data.frame(V1 = c("chr1", "chr1", "chr1", "chr2", "chr2", "ch2"),
                Start = c(0, 540, 920, 0, 582, 715 ),
                Stop = c(230, 720, 1270, 350, 635, 950), stringsAsFactors = F)

Y <- data.frame(V1 = c("chr1", "chr1", "chr1", "chr2", "chr2", "ch2"),
                Start = c(3, 16, 180,
                          15, 585, 800 ),
                Stop = c(15, 24, 201,
                         102, 612, 850), stringsAsFactors = F)



library(tidyverse)
X %>%
  mutate(count = pmap_int(list(V1, Start, Stop), ~filter(Y, V1 == ..1,  Start >= ..2, Stop <=..3) %>% nrow))

    V1 Start Stop count
1 chr1     0  230     3
2 chr1   540  720     0
3 chr1   920 1270     0
4 chr2     0  350     1
5 chr2   582  635     1
6  ch2   715  950     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...