通过比较 R 中的 kmers 找到连续性

Finding contiguity by comparing kmers in R

你好,我有一个如下所示的数据框:

  LR ID           Kmer       ProcID
    1         GTACGTAT         10
    1         TACGTATC         10
    1         ACGTATCG          2
    1         GTATCGTT          3
    2         GTTACGTA         16
    2         TTACGTAC         16
    2         TACGTACT         16
    2         ACGTACTT         11

输出类似于:

LR1 max length: 16 #(as 2 kmers are consecutively going to proc 10)
LR1 min length: 8
LR2 max length: 24 #(as 3 kmers are consecutively going to proc 16)

有 800 个像这样的 LR ID,它们让 kmers 进入不同的进程。我的 objective 是找到最长的不间断序列,该序列属于一个 LR ID,去往相同的目标 proc id。 我需要将一行的 (k-1) 个字符与下一行进行比较,依此类推。

我知道有这个函数叫

str_detect() 

在 R 中检查是否存在任何模式。我想知道有没有其他更好的方法来做到这一点?

我们可以计算每个 LRID 中连续出现的 ProcID 并计算其中的最小值和最大值。

library(dplyr)

df %>%
  count(LRID, grp = data.table::rleid(ProcID)) %>%
  group_by(LRID) %>%
  summarise(max = max(n) * 8, 
            min = min(n) * 8)

#   LRID   max   min
#* <int> <dbl> <dbl>
#1     1    16     8
#2     2    24     8

或使用data.table

library(data.table)
setDT(df)[, .(n = .N), .(LRID, rleid(ProcID))][, .(max = max(n) * 8, min = min(8)), LRID]

我们可以使用

library(dplyr)
df1 %>% 
    count(LRID, grp = cumsum(ProcID != lag(ProcID, default = first(ProcID)))) %>%
    group_by(LRID) %>% 
    summarise(max = max(n) * 8, 
             min = min(n) * 8, .groups = 'drop')
# A tibble: 2 x 3
#   LRID   max   min
#  <int> <dbl> <dbl>
#1     1    16     8
#2     2    24     8

数据

df1 <- structure(list(LRID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Kmer = c("GTACGTAT", 
"TACGTATC", "ACGTATCG", "GTATCGTT", "GTTACGTA", "TTACGTAC", "TACGTACT", 
"ACGTACTT"), ProcID = c(10L, 10L, 2L, 3L, 16L, 16L, 16L, 11L)),
class = "data.frame", row.names = c(NA, 
-8L))