通过比较 R 中的 kmers 来寻找连续性 数据

问题描述

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

  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,它们让 kmer 进入不同的进程。我的目标是找到属于一个 LR ID 的最长不间断序列,该序列到达相同的目标 proc id。 我需要将一行的 (k-1) 个字符与其下一行进行比较,依此类推。

我知道有个函数叫做

str_detect() 

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

解决方法

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

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,2L,2L),Kmer = c("GTACGTAT","TACGTATC","ACGTATCG","GTATCGTT","GTTACGTA","TTACGTAC","TACGTACT","ACGTACTT"),ProcID = c(10L,10L,3L,16L,11L)),class = "data.frame",row.names = c(NA,-8L))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...