Обобщить выполнение условия между строками - PullRequest
0 голосов
/ 17 июня 2020

У меня есть такой фрейм данных:

Name Start End  Feature
A    50    100   N
A    55    97    R
A    160   200   L
B    300   350   Y
B    310   350   X
B    349   370   M

Я хотел бы получить новый фрейм данных, сгруппированный по первому, второму и третьему столбцу, но я хотел бы получить две новые переменные: одна с подсчетом количество раз, когда столбец A повторяется, а другой подсчитывает количество разных координат, представляющих небольшое перекрытие (скажем, я хочу менее 20% перекрытия, вычисляя его как length(overlaped_region)/mean(c(length(region1), length(region2)).

Как я могу достичь это?

Я пробовал:

newdf<- df %>% group_by(Names, Start, End) %>% summarise (count(Start), ???)

Как я могу получить столбец, в котором подсчитывается количество различных координат, перекрывающихся менее чем на 20% для каждого имени?

Name  Count1  Count2

A       3       2
B       3       2

1 Ответ

2 голосов
/ 17 июня 2020

Вы запросили dplyr решение на основе тега. Надеюсь, у вас не слишком много строк данных.

Все, что вам нужно сделать с помощью dplyr, - это неэквивалентное соединение. Пакет fuzzyjoin предлагает следующие функции:

library(dplyr)
library(fuzzyjoin)
df %>% 
  mutate(Length = 1 + End - Start) %>%
  fuzzy_left_join(., ., 
                  by = c("Name" = "Name", "ID" = "ID",
                         "Start" = "End", "End" = "Start"), 
                  match_fun = list(`==`,`!=`,`<=`,`>=`)) %>%
  mutate(Overlap = abs(pmax(Start.x,Start.y,na.rm = TRUE) - pmin(End.x,End.y,na.rm=TRUE)),
         Low = Overlap / (Length.x + Length.y)/2 < 0.2) %>%
  group_by(Name.x) %>%
  summarise(Count1 = length(unique(ID.x)), Count2 = sum(!is.na(Low) & !Low))
#  Name.x Count1 Count2
#  <fct>   <int>  <int>
#1 A           3      2
#2 B           6      2

Лучше всего использовать пакет GenomicRanges.

...