首页 > 解决方案 > 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列)的数量。

我想在我的 Windows 文件上创建 for 循环,然后逐一检查我的数据的每一行并求和,但我有 6 亿行,我相信有一种最快的方法.. 我只是不知道。

非常感谢,

干杯,

卡加米

标签: rdataframeintervals

解决方案


由于您没有提供任何可重现的数据,因此我使用了自己的一些示例数据

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

我已经使用名为的包fuzzyjoin来执行此操作,它将添加一个新列,只要它在某个范围内时就会inside_range给出值TrueTRUEPOS

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。祝你好运


推荐阅读