R语言:如何按行应用双参函数获取序列与参考序列的mismatch位置
修正序列Mismatch位置检测代码
问题背景
现有参考序列和多条查询序列:
ref_seq <- "ATTT" df <- data.frame(V1=c("AATT", "TTTT", "GGTT"))
需要返回每条查询序列与参考序列相比的mismatch位置,但原代码输出不符合预期:
原代码
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
问题分析
- 参数逻辑混淆:原函数调用时传递的参数顺序导致差异位置判断反向,第一条查询的结果完全错误。
- apply的局限性:
apply会强制将结果转换为矩阵,当某条查询返回多个mismatch位置时,结果会被截断或丢失,导致第三条查询的结果无法显示。
修正方案
方法1:用lapply保留完整结果
明确参数含义,改用lapply处理向量输入,确保每个结果完整保留:
seqdiff <- function(query_seq, ref_seq) { # 拆分序列为单个碱基 query_split <- strsplit(query_seq, split = "")[[1]] ref_split <- strsplit(ref_seq, split = "")[[1]] # 定位差异位置 which(query_split != ref_split) } # 遍历所有查询序列 result <- lapply(df$V1, seqdiff, ref_seq = ref_seq) result
输出结果:
[[1]] [1] 2 [[2]] [1] 1 [[3]] [1] 1 2
方法2:转换为类矩阵格式输出
如果需要接近预期的矩阵样式,可将列表结果转为字符串后构建矩阵:
# 将每个差异位置集合转为字符串 result_str <- sapply(result, function(x) paste(x, collapse = " ")) # 构建矩阵并设置列名 result_matrix <- matrix(result_str, ncol = 1, dimnames = list(NULL, "V1")) result_matrix
输出结果:
V1 [1,] "2" [2,] "1" [3,] "1 2"
关键说明
- 函数参数明确区分查询序列和参考序列,避免逻辑混淆。
lapply适合处理长度可变的结果,不会像apply那样强制统一结构。- 类矩阵格式的输出通过字符串拼接实现,兼顾可读性和格式要求。
内容的提问来源于stack exchange,提问作者Paolo Lorenzini
相关产品推荐
相关产品推荐

