【发布时间】:2021-05-03 18:51:42
【问题描述】:
大家好,我正在尝试从随机创建的序列中创建距离矩阵。 #设置代码
DNA <- c("A","G","T","C")
randomDNA <- c()
#创建64个元素的向量
for (i in 1:64){
randomDNA[i] <- paste0(sample(DNA, 6, replace = T), sep = "", collapse = "")
warnings()
}
sizeofDNA <- length(randomDNA)
#这部分我想在向量的组件之间迭代
split_vector <- c()
DNAdiff <- c()
for (i in 1:length(randomDNA)){
split_vector <- strsplit(randomDNA[i], "")[[1]]
#print(split_vector)
for (j in 1:length(randomDNA)){
split_vector2 <- strsplit(randomDNA[j], "")[[1]]
#print(split_vector2)
DNAdiff[i,j] <- setdiff(split_vector,split_vector2)
#or
#DNAdiff[i] <- lenght(setdiff(strsplit(randomDNA[22], "")[[1]],strsplit(randomDNA[33], "")[[1]]))
}
}
它不起作用的是 A:setdiff 没有按我的预期工作 B: 没有创建数组
问题我如何将 setdiff 的结果(如果它可以工作)导出到一个数组,以便我将拥有像数组一样的距离矩阵? 任何建议都受到高度欢迎。 谢谢大家
编辑:所以有两种解决方案:
A. 使用 @ThomasIsCoding 在 cmets 中提到的“adist”函数;这将计算 Levenshtein 距离:
DNA <- c("A","G","T","C")
randomDNA <- c()
for (i in 1:64){
randomDNA[i] <- paste0(sample(DNA, 6, replace = T), sep = "", collapse = "")
}
dm <-as.matrix(adist(randomDNA))
rownames(dm) <- randomDNA
colnames(dm) <- randomDNA
pdf("heatmap.pdf")
heatmap(dm, Rowv = NA, Colv = NA)
dev.off()
write.csv(dm,"distance_matrix.csv", row.names = T, col.names = T )
B.另一种计算汉明距离的方法是:
DNA <- c("A","G","T","C")
randomDNA <- c()
for (i in 1:96){
randomDNA[i] <- paste0(sample(DNA, 6, replace = T), sep = "", collapse = "")
}
Humm <- matrix(nrow=length(randomDNA), ncol=length(randomDNA))
for (i in 1:length(randomDNA)){
split_vector <- strsplit(randomDNA[i], "")[[1]]
for (j in 1:length(randomDNA)){
split_vector2 <- strsplit(randomDNA[j], "")[[1]]
#Hamming distance is calculated as:
Humm[i,j] <- sum(split_vector != split_vector2)
}
}
rownames(Humm) <- randomDNA
colnames(Humm) <- randomDNA
pdf("heatmap.pdf")
heatmap(Humm, Rowv = NA, Colv = NA)
dev.off()
write.csv(Humm,"distance_matrix.csv", row.names = T, col.names = T )
【问题讨论】: