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