我有一个参考和查询序列:
ref_seq <- "ATTT"
df <- data.frame(V1=c("AATT", "TTTT", "GGTT"))
我想返回与参考相比每个查询序列中不匹配的位置:
seqdiff <- function(seq1, seq2) {
seq <- strsplit(c(seq1, seq2), split= '')
mismatches <- which(seq[[1]] != seq[[2]])
return(mismatches)
}
apply(X=df, MARGIN=2, function(x) seqdiff(x, ref_seq))
# V1
# [1,] 1
# [2,] 2
预期输出:
# V1
# [1,] 2
# [2,] 1
# [3,] 1 2
鉴于这些可能是核苷酸序列,您可以考虑该
adist
函数。在其他情况下,它可以用于确定将一个字符串转换为另一个字符串所需的最小插入、删除和替换的加权次数。这允许在转换过程中计算计数,以及“trafos”属性中的转换序列(M = 匹配,I = 插入,D = 删除,S = 替换)。1)这将生成一个数据框,其
mismatch
列是向量列表。2)
mismatch
除了列是字符向量之外,这个是相同的。3)这解除了(1)的嵌套,给出了一个长格式数据框,其中每个输入行的输出可以跨越多个输出行。
(图片后继续)
4)要使用
apply
该功能,应使用list
或toString
一种方法
substr
如果您只想匹配特定位置,请在ref_seq中使用空格,例如
以数据框格式获取结果
如果
nchar
的ref_seq
和的所有元素的V1
长度相同,我们可以尝试vapply()
,utf8ToInt()
其中which()
。从
i
到 的强制转换V2
可以改进;我还没有更好的主意。笔记
您可以使用
!=
并mapply
解析TRUE
位置toString
。注意:避免对 s 进行逐行操作
data.frame
,这非常低效。记住, adata.frame
实际上是一串向量,相邻位置显示为行——因此可以考虑使用mapply()
或Map()
。apply()
是为矩阵设计的(正如本解决方案中应用的那样),很少(甚至根本不)用于data.frame
s。