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
相关产品推荐
相关产品推荐

