# 处理子文件夹下*ChIP.txt文件的函数
simple_convert_to_gff <- function(input_dir = ".", recursive = TRUE) {
# 获取所有符合条件的文件
pattern <- "*_ChIP\\.txt$"
files <- list.files(path = input_dir, pattern = pattern,
full.names = TRUE, recursive = recursive)
if (length(files) == 0) {
cat("未找到匹配的*ChIP.txt文件\n")
return(NULL)
}
cat("找到", length(files), "个匹配的文件:\n")
print(files)
# 对每个文件进行处理
for (input_file in files) {
cat("正在处理文件:", input_file, "\n")
# 读取文件,跳过前33行
data <- read.table(input_file, skip = 33, sep = "\t",
stringsAsFactors = FALSE, comment.char = "")
# 过滤掉包含下划线的染色体行
# 假设染色体信息在第二列
data_filtered <- data[!grepl("_|^chrM$|^chrEBV$|^chrY$", data[, 2]), ]
# 确保输出文件在同一文件夹中
output_dir <- dirname(input_file)
# 提取文件名前缀(去掉ChIP.txt后缀)
file_prefix <- sub("_ChIP\\.txt$", "", basename(input_file))
output_file <- file.path(output_dir, paste0(file_prefix, "peak.gff"))
# 直接构建GFF行
gff_lines <- apply(data_filtered, 1, function(row) {
paste(
row[2], # 第1列: chr (原始数据的第2列)
row[1], # 第2列: PeakID (原始数据的第1列)
".", # 第3列: 用点表示缺失
row[3], # 第4列: start (原始数据的第3列)
row[4], # 第5列: end (原始数据的第4列)
".", # 第6列: 用点表示缺失
".", # 第7列: strand (使用点号)
".", # 第8列: 用点表示缺失
row[1], # 第9列: PeakID (原始数据的第1列)
sep = "\t"
)
})
# 写入文件(不包含列名)
writeLines(gff_lines, output_file)
cat("转换完成!输出文件:", output_file, "\n")
cat("转换了", length(gff_lines), "行数据\n\n")
}
cat("所有文件处理完成!\n")
}
# 批量处理特定文件夹的函数
batch_convert_chip_files <- function(input_dir = ".", recursive = TRUE) {
simple_convert_to_gff(input_dir, recursive)
}
# 1. 处理当前目录及其子目录下的所有*ChIP.txt文件
simple_convert_to_gff()
# 2. 处理指定目录下的所有*ChIP.txt文件(不包括子目录)
simple_convert_to_gff("/path/to/your/files", recursive = FALSE)
# 3. 处理指定目录及其子目录下的所有*ChIP.txt文件
simple_convert_to_gff("/path/to/your/data")