#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 миллионов строк, и при использовании ваших методов мне не хватает памяти. Я постараюсь найти другой способ избежать этой проблемы, но большое спасибо!