Окна интервалов значений в R

#r #dataframe #intervals

#r #фрейм данных #интервалы

Вопрос:

У меня есть несколько интервалов окон, которые выглядят так:

 Start       Stop
19136293    19138512
20708651    20716555
31063462    31064384
  

И тогда у меня есть данные, которые выглядят так:

 Read TrueC MapC TruePos     MappedPos   ResMap
JLN6    22  22  16050005    16050091    TP
9MRW    22  22  16050032    16050032    TP
GRR3    22  14  16050075    19792677    FP
V19X    22  *   17023341    0           FN 
  

И я пытаюсь найти количество прочитанных внутри и снаружи предыдущих окон; чтение находится внутри окна, если значение TruePos находится внутри одного интервала окна. Моя цель — получить количество TP / FP / FN (Столбец ResMap) внутри и снаружи окон.

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

Большое спасибо,

Приветствия,

Cagami

Ответ №1:

Поскольку вы не предоставили никаких воспроизводимых данных, я использовал некоторые собственные образцы данных

 dput(range)
structure(list(start = c(10L, 25L, 50L, 61L, 85L, 100L), end = c(15L, 
27L, 53L, 66L, 89L, 102L)), class = "data.frame", row.names = c(NA, 
-6L))

> range
  start end
1    10  15
2    25  27
3    50  53
4    61  66
5    85  89
6   100 102

> dput(df)
structure(list(Id = 1:15, truepos = c(65L, 59L, 61L, 74L, 92L, 
49L, 72L, 96L, 81L, 2L, 34L, 27L, 66L, 87L, 19L)), class = "data.frame", row.names = c(NA, 
-15L))

> df
   Id truepos
1   1      65
2   2      59
3   3      61
4   4      74
5   5      92
6   6      49
7   7      72
8   8      96
9   9      81
10 10       2
11 11      34
12 12      27
13 13      66
14 14      87
15 15      19
  

Я использовал package named fuzzyjoin для подобных действий, который добавит новый столбец inside_range , дающий значение, как True всякий TRUEPOS раз, когда он находится внутри одного из диапазонов

 library(fuzzyjoin)
fuzzy_left_join(df, range, by = c("truepos" = "start", "truepos" = "end"), 
                match_fun = list(`>=`, `<`)) %>% mutate(inside_range = !is.na(start)) %>%
  select(-start, -end)

>  Id truepos inside_range
1   1      65         TRUE
2   2      59        FALSE
3   3      61         TRUE
4   4      74        FALSE
5   5      92        FALSE
6   6      49        FALSE
7   7      72        FALSE
8   8      96        FALSE
9   9      81        FALSE
10 10       2        FALSE
11 11      34        FALSE
12 12      27        FALSE
13 13      66        FALSE
14 14      87         TRUE
15 15      19        FALSE

  

Я думаю, что это служит вашей цели, и вы можете воспроизвести эту методологию для своих данных df . Удачи

Комментарии:

1. Привет, большое спасибо за ваши советы. Похоже, что это работает, но, как я уже сказал, у меня 600 миллионов строк, и при использовании ваших методов мне не хватает памяти. Я постараюсь найти другой способ избежать этой проблемы, но большое спасибо!