函数在R中的字符串的特定位置查找不同的模式

函数在R中的字符串的特定位置查找不同的模式,r,stringr,R,Stringr,我试图在R中创建一个函数,在字符串中搜索特定位置的特定模式,如果字母出现在已确定的位置,我想计算它 数据集示例: library(dplyr) mutations <- tibble( "position" = c(9,10), "AA" = c("G","G")) strings <- c("EVQLVESGGGLAKPG", "VQ

我试图在R中创建一个函数,在字符串中搜索特定位置的特定模式,如果字母出现在已确定的位置,我想计算它

数据集示例:

library(dplyr)

mutations <- tibble(
  "position" = c(9,10),
  "AA" = c("G","G"))

strings <- c("EVQLVESGGGLAKPG", 
             "VQLVESGGGLAKPGGS",
             "EVQLVESGGALAKPGGSLRLSCAAS")
在本例中,所有字符串在位置9处都有一个
“G”
,因此它们都将得到1,而三个序列中只有一个在位置10处有一个
“G”
,因此该序列将有2个

我试图从
stringr
包中使用
str\u locate\u all()
来定位位置,然后与我的数据帧进行比较以计数,但我没有得到我想要的

library(stringr)

.class_mutations <- function(sequences, mutations){
  .count_pattern <- function(x){
    df <- sum(as.integer(locating_all_patterns[[x]][,"start"] == mutations$position[mut]))
  }
  
  for(mut in nrow(mutations)){
    locating_all_patterns <- str_locate_all(pattern = mutations$AA[mut], sequences)
    counting_patterns <- lapply(locating_all_patterns, .count_pattern)
  }
    
  return(counting_patterns)
}

.class_mutations(strings, mutations)

库(stringr)
.R类
rowSums(外部(字符串,序列)(nrow(突变)),
功能(st,i){
substr(st,突变$position[i],突变$position[i])==突变$AA[i]
}))
# [1] 2 1 1
走查:

  • outer
    实际上只生成两个向量,这是两个参数笛卡尔乘积的扩展。如果我们插入一个
    browser()
    作为内部anon函数的第一行,我们将看到

    数据帧(st,i)
    #圣一
    #1 EVQLVESGGGLAKPG 1
    #2 VQLVESGGGLAKPGS 1
    #3 EVQLVESGGALAKPGSLRLSCAAS 1
    #4 EVQLVESGGGLAKPG 2
    #5 VQLVESGGGLAKPGS 2
    #6 EVQLVESGGALAKPGSLRLSCAAS 2
    
    (仅显示为专栏演示文稿的框架。
    st
    i
    都是简单向量。)

    从这里,知道
    substr
    在所有参数中都是矢量化的,那么对
    substr
    的单个调用将在每个
    st
    环中找到
    i
    th字符

  • substr
    的结果是字母向量。从上面继续相同的
    browser()
    会话

    substr(st,突变$position[i],突变$position[i])
    #[1]“G”“G”“G”“L”“A”
    $AA[i]
    #[1]“G”“G”“G”“G”“G”“G”
    substr(st,突变$position[i],突变$position[i])==突变$AA[i]
    #[1]正确-正确-错误-错误
    
    translations$AA[i]
    向我们展示了我们在寻找什么。这里向量化方法的一个优点是,
    translations$AA[i]
    将始终保持相同的长度,并且按照
    substr(.)
    检索的预期字母顺序

  • 外部
    本身返回一个
    矩阵
    ,其中
    长度(X)
    行和
    长度(Y)
    列(
    X
    Y
    分别是
    外部
    的第一个和第二个参数)

    outer(字符串、序列(nrow(突变)),
    功能(st,i){
    substr(st,突变$position[i],突变$position[i])==突变$AA[i]
    })
    #      [,1]  [,2]
    #[1,]正确
    #[2,]对错
    #[3,]对错
    
    在每个字符串中找到的正确突变数只是每行的总和。(因此
    rowSums


如果您担心大量的
突变
字符串
,您可以替换
外部
,并迭代每行
突变

行和(sapply(seq_len(nrow(突变)),函数(i)substr(字符串,突变$position[i],突变$position[i])==突变$AA[i]))
# [1] 2 1 1

这将为每一行调用一次
substr
,因此如果
outer
-爆炸过大,这可能会减少内存占用。

对于基本R选项,我们可以确保字符串函数。此方法比较替换目标字符前后每个子字符串的长度:

nchar(子字符串,9,10))-
nchar(gsub(“G”,substr(字符串,9,10),fixed=TRUE))
[1] 2 1 1
数据:

strings <- c("EVQLVESGGGLAKPG", 
             "VQLVESGGGLAKPGGS",
             "EVQLVESGGALAKPGGSLRLSCAAS")

字符串我以“G”为例,实际上,我有一个数据框,在不同的位置有许多不同的字母。要使用您的方法,我想我必须为数据帧中的每个不同的“AA”做一个循环。是吗?我只能回答我能看到的问题,但是你可以使用我在上面的答案中的逻辑,在字母替换向量上使用
apply
函数。我测试了复制字符串1000000次,看它是否对这个数量的字符串太慢,但仍然非常快。我很惊讶!内存使用基于
长度(字符串)*nrow(突变)
。如果
突变
很大,那么这就是问题可能出现的地方。很高兴它工作得很好!
strings <- c("EVQLVESGGGLAKPG", 
             "VQLVESGGGLAKPGGS",
             "EVQLVESGGALAKPGGSLRLSCAAS")