You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言按位置比较序列相似度生成成对相似矩阵的实现方法

R实现按位置序列成对相似度计算

实现思路

  • 首先将每个字符串序列拆分为单个字符组成的矩阵,每行对应一个barcode的序列
  • 两两对比两个序列对应位置的字符匹配数,计算匹配数占总序列长度的比例后乘以100得到相似度
  • 可根据需求将对角线(自身对比)的值替换为x

基础包实现(无需安装第三方依赖)

# 构造示例数据(可替换为你自己的数据集)
df <- data.frame(
  barcode = c("B1","B2", "B3", "B4"),
  sequence = c("AATT", "AATT", "TATT", "TATA")
)

# 拆分序列为碱基矩阵
seq_mat <- do.call(rbind, strsplit(df$sequence, ""))
seq_len <- ncol(seq_mat)

# 计算相似度矩阵
sim_mat <- outer(
  X = 1:nrow(seq_mat),
  Y = 1:nrow(seq_mat),
  FUN = function(i,j) rowSums(seq_mat[i,] == seq_mat[j,]) / seq_len * 100
)
rownames(sim_mat) <- df$barcode
colnames(sim_mat) <- df$barcode

# 对角线替换为x(和示例输出格式一致,不需要可删除该行)
diag(sim_mat) <- "x"

# 查看结果
print(sim_mat)

输出结果和你给出的示例完全一致:

B1   B2   B3   B4  
B1 "x"  "100" "75" "50"
B2 "100" "x"  "75" "50"
B3 "75" "75" "x"  "75"
B4 "50" "50" "75" "x"

高效实现(适合大数量级序列)

如果你的barcode数量较多,可以用stringdist包的汉明距离计算接口,运行效率更高:

# 安装依赖包(首次运行需要执行)
install.packages("stringdist")
library(stringdist)

# 计算汉明距离(即两个序列不匹配的位置数)
hamming_mat <- as.matrix(stringdistmatrix(df$sequence, method = "hamming"))
# 转换为相似度
sim_mat <- (nchar(df$sequence[1]) - hamming_mat) / nchar(df$sequence[1]) * 100

# 设置行列名、替换对角线
rownames(sim_mat) <- df$barcode
colnames(sim_mat) <- df$barcode
diag(sim_mat) <- "x"

两种方法的计算结果完全一致。

内容的提问来源于stack exchange,提问作者nouse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:15:05