#为了解决pcm的格式问题,我看了motifStack的原文档,但是没找到。如果有大佬知道,还请告知,小弟给你跪一个。
#于是想到是否可以将我们前面设置的矩阵文件导出成pcm呢?开始尝试!
直接上干货:
# 加载必要的库
library(tools)
library(motifStack)
library(ggplot2)
# 读取 .motif 文件的函数
read_motif_file <- function(filepath) {
lines <- readLines(filepath)
# 获取motif名称
motif_name <- sub("^>", "", lines[1])
# 读取数据部分
data_lines <- lines[-1]
pfm_data <- do.call(rbind, lapply(data_lines, function(line) {
as.numeric(unlist(strsplit(line, "\\s+")))
}))
# 转置矩阵
pfm_data <- t(pfm_data)
list(name = motif_name, pfm = pfm_data)
}
# 将motif数据写到 .pcm 文件的函数
write_pcm_file <- function(motif, output_filepath) {
connection <- file(output_filepath, "w")
# 写入motif名称
writeLines(paste(">", motif$name, sep=""), connection)
# 读取数据并逐列写入
pfm <- motif$pfm
bases <- c("A", "C", "G", "T")
for (i in 1:nrow(pfm)) {
line <- paste(bases[i], paste(pfm[i, ], collapse = " "), sep = " ")
writeLines(line, connection)
}
close(connection)
}
# 处理目录中的所有 .motif 文件的函数
process_motif_files <- function(directory) {
# 获取所有的 .motif 文件
files <- list.files(directory, pattern = "\\.motif$", full.names = TRUE)
# 遍历每一个文件,并转换为 .pcm 文件
for (file in files) {
try({
motif <- read_motif_file(file)
pcm_file <- paste0(file_path_sans_ext(file), ".pcm")
write_pcm_file(motif, pcm_file)
message("Processed: ", basename(file), " -> ", basename(pcm_file))
}, silent = TRUE)
}
}
# 运行示例
target_directory <- "/Users/JHK/Desktop/"
process_motif_files(target_directory)
motifs<-importMatrix(dir(file.path("/Users/JHK/Desktop/"),"pcm$", full.names = TRUE))
motifStack(motifs, layout="stack", ncex=1.0)
# 建立进化树
motifStack(motifs, layout="tree")
用法:只需要替换你的文件路径就行,然后就是原始的文件中,就是>后面的内容,需要手动修改一下,因为最终呈现出来的单个logo名字是按照这个来的。
至于怎么美化,就按照喜好来就行。