Я запускаю сценарий R для анализа некоторых биологических данных. Ниже приведен пример данных фрагмента и скрипта. Этот файл данных имеет много столбцов (но я хотел бы сосредоточиться на 5-м столбце — Gene). У меня есть более 100 таких файлов данных (считайте 5-й столбец Gene во всех файлах интересующим столбцом). В настоящее время я запускаю каждый файл отдельно в R, и этот процесс утомителен. Я хотел бы запустить сценарий R для всех файлов данных одновременно и сохранить все данные в другой папке в соответствии с именем файла. Можно ли зациклить или повторить и проанализировать все файлы данных сразу в скрипте. Пожалуйста, помогите мне с этим.
Спасибо,
Туфик
Отформатированный вопрос и пересмотренный фрейм данных
Вставлено: имена файлов для чтения
M3.1_IPA.txt
M8.1_IPA.txt
M8.2_IPA.txt
M8.3_IPA.txt
1. Загрузите наборы генов для анализа
Data_file <- read.delim(file = "./M3.1_IPA.txt", stringsAsFactors = FALSE, check.names = FALSE, row.names = NULL)
dput(head(Data_file, 5))
structure(list(row.names = c("M3.1_ALPP", "M3.1_ALS2CR14", "M3.1_ANKRD30B",
"M3.1_ARL16", "M3.1_BCYRN1"), X = 1:5, Module = c("M3.1", "M3.1",
"M3.1", "M3.1", "M3.1"), Title = c("Cell Cycle", "Cell Cycle",
"Cell Cycle", "Cell Cycle", "Cell Cycle"), Gene = c("ALPP", "ALS2CR14",
"ANKRD30B", "ARL16", "BCYRN1"), Probes = c("ILMN_1693789", "ILMN_1787314",
"ILMN_1730678", "ILMN_2188119", "ILMN_1678757"), Module_gene = c("M3.1_ALPP",
"M3.1_ALS2CR14", "M3.1_ANKRD30B", "M3.1_ARL16", "M3.1_BCYRN1"
)), row.names = c(NA, 5L), class = "data.frame")
Module_10_1 <- Data_file[,5]
Module_10_1_geneLists <- list(Module_10_1_geneListName=Module_10_1)
Выберите базу данных мотивов для использования (например, организм и расстояние вокруг TSS)
data(motifAnnotations_hgnc)
motifRankings <- importRankings("./hg19-tss-centered-10kb-7species.mc9nr.feather")
Рассчитать обогащение
motifs_AUC <- calcAUC(Module_10_1_geneLists, motifRankings, nCores=1)
Type = "Enrichment"
Module = "M10_1"
auc <- getAUC(motifs_AUC)
##Export the plots##
pdf(paste0(Type, "_", Module, "_AUC_Histogram_Plot.pdf"), height = 5, width = 10)
hist(auc, main = "Module_10_1", xlab = "AUC histogram",
breaks=100, col = "#ff000050", border = "darkred")
nes3 <- (3*sd(auc)) + mean(auc)
abline(v=nes3, col = "red")
dev.off()
Выберите значимые мотивы и/или аннотируйте TF
motifEnrichmentTable <- addMotifAnnotation(motifs_AUC, nesThreshold=3,
motifAnnot=motifAnnotations_hgnc)
##Export the Motif enrichment analysis results###
write.csv(motifEnrichmentTable, file = "./motifEnrichmentTable.csv", row.names = F, sep = ",")
Определите гены с лучшим обогащением для каждого мотива
motifEnrichmentTable_wGenes_v1 <- addSignificantGenes(motifEnrichmentTable,
rankings=motifRankings,
geneSets=Module_10_1_geneLists)
##Export the Motif enrichment analysis results##
write.csv(motifEnrichmentTable_wGenes_v1,
file = "./motifEnrichmentTable_wGenes_v1.csv",
row.names = F, sep = ",")
Сюжет на несколько мотивов
geneSetName <- "Module_10_1_Genelist"
selectedMotifs <- c("cisbp__M6275",
sample(motifEnrichmentTable$motif, 2))
par(mfrow=c(2,2))
Type_v1 <- "Few_motifs"
##Export the plots
pdf(paste0(Type_v1, "_", Module, "_Sig_Genes_Plot.pdf"), height = 5, width = 5)
getSignificantGenes(Module_10_1_geneLists,
motifRankings,
signifRankingNames=selectedMotifs,
plotCurve=TRUE, maxRank=5000, genesFormat = "none",
method = "aprox")
dev.off()
Конечным результатом RcisTarget является data.table и экспорт в html.
motifEnrichmentTable_wGenes_v1_wLogo <- addLogo(motifEnrichmentTable_wGenes_v1)
resultsSubset <- motifEnrichmentTable_wGenes_v1_wLogo[1:147,]
Type_v2 <- "Motifs_Table"
library(DT)
## export the data table to html file format###
dtable <- datatable(resultsSubset[,-c("enrichedGenes", "TF_lowConf"), with=FALSE],
escape = FALSE, # To show the logo
filter = "top", options=list(pageLength=100))
html_test <- "dtable.html"
saveWidget(dtable, html_test)
Построение сети и экспорт в формат html
signifMotifNames <- motifEnrichmentTable$motif[1:3]
incidenceMatrix <- getSignificantGenes(Module_10_1_geneLists,
motifRankings,
signifRankingNames=signifMotifNames,
plotCurve=TRUE, maxRank=5000,
genesFormat = "incidMatrix",
method = "aprox")$incidMatrix
library(reshape2)
edges <- melt(incidenceMatrix)
edges <- edges[which(edges[,3]==1),1:2]
colnames(edges) <- c("from","to")
library(visNetwork)
motifs <- unique(as.character(edges[,1]))
genes <- unique(as.character(edges[,2]))
nodes <- data.frame(id=c(motifs, genes),
label=c(motifs, genes),
title=c(motifs, genes), # tooltip
shape=c(rep("diamond", length(motifs)), rep("elypse", length(genes))),
color=c(rep("purple", length(motifs)), rep("skyblue", length(genes))))
Network <- visNetwork(nodes, edges) %>% visOptions(highlightNearest = TRUE,
nodesIdSelection = TRUE)
##Export the network##
visSave(Network, file = "Network.html")
@ Дэн Кеннеди, большое спасибо за ваш комментарий. Да, я хочу перебирать файлы.
Хорошо, это возможно, вам просто нужно создать вектор с именами файлов в нем и перебрать его. Можете ли вы изменить свой вопрос, включив в него имена файлов, которые вы хотите прочитать? Затем я могу написать правильный ответ, чтобы решить проблему.
@ Дэн Кеннеди, спасибо. Фрейм данных вопросов и фрагментов был пересмотрен. Также включены имена файлов для чтения.






Я написал это на основе приведенных имен файлов примеров:
file_names <- c("M3.1_IPA.txt","M8.1_IPA.txt","M8.2_IPA.txt","M8.3_IPA.txt")
Самый простой способ — перебрать 1:length(file_names) и создать уникальный набор выходных файлов для каждой итерации. В соответствии с вашим вопросом вы хотите сохранить результаты в разные папки. Это можно сделать, извлекая имя файла (удалив .txt), а затем создав новый каталог с этим именем. Затем вы можете сохранить все свои выходные данные для этой итерации в новый каталог.
Затем создается новый каталог для следующей итерации, поэтому вы не сохраняете предыдущие результаты.
for(i in 1:length(file_names)){
Data_file <- read.csv(file = paste0("./",file_names[i]), stringsAsFactors = FALSE, check.names = FALSE)
Module_10_1 <- Data_file[,1]
Module_10_1_geneLists <- list(Module_10_1_geneListName=Module_10_1)
data(motifAnnotations_hgnc)
motifRankings <- importRankings("./hg19-tss-centered-10kb-7species.mc9nr.feather")
motifs_AUC <- calcAUC(Module_10_1_geneLists, motifRankings, nCores=1)
Type = "Enrichment"
Module = "M10_1"
auc <- getAUC(motifs_AUC)
# Extract the file name without the extension, so the directory with the results
# will correspond to this name:
new_directory_name <- gsub(x = file_names[i],pattern = "(.*)\\.txt","\\1")
#Create the new directory:
dir.create(new_directory_name)
##Export the plots##
# Save to the new directory
pdf(paste0(new_directory_name,"/",Type,"_", Module,"_AUC_Histogram_Plot.pdf"), height = 5, width = 10)
hist(auc, main = "Module_10_1", xlab = "AUC histogram",
breaks=100, col = "#ff000050", border = "darkred")
nes3 <- (3*sd(auc)) + mean(auc)
abline(v=nes3, col = "red")
dev.off()
}
Я опустил остальную часть вашего скрипта, потому что решение для сохранения motifEnrichmentTable_wGenes_v1.csv, _Sig_Genes_Plot.pdf и других выходных данных такое же, как и выше с _AUC_Histogram_Plot.pdf. Вам просто нужно записать эти выходные данные в новый каталог с помощью paste0(new_directory_name,"/",<insert-output-name>).
Если у вас много файлов, вместо создания вектора вручную file_names вы можете искать в локальном каталоге файлы, соответствующие правильному шаблону. например
all_files <- dir()
file_names <- grep(all_files,pattern = "*.txt$",value = TRUE)
вернет все файлы .txt в локальном каталоге. Вы можете уточнить его, если это должны быть только файлы .txt, начинающиеся с «M»:
all_files <- dir()
file_names <- grep(all_files,pattern = "^M.*.txt$",value = TRUE)
Вы бы сделали это, если не все файлы .txt в локальном каталоге являются входными файлами, и вам может потребоваться дополнительно уточнить шаблон регулярного выражения, пока вы не захватите только нужные файлы txt.
Для файлов .html это немного сложнее, потому что saveWidget() в настоящее время не позволяет сохранять с использованием относительных путей к файлам, но есть решение с использованием withr::with_dir(). Это должно работать для части 7:
withr::with_dir(new_directory_name, saveWidget(dtable, file = "dtable.html"))
и это должно работать для части 8:
withr::with_dir(new_directory_name, saveWidget(Network, file = "Network.html"))
отличный. Спасибо за очень полезные материалы. Это очень полезно. Я мог легко экспортировать файлы *.csv и pdf. Один вопрос, пожалуйста, дайте мне знать, как нам экспортировать файлы *.html для моего кода ветвей 7 и 8 выше, когда мы запускаем этот тип кода. Пробовал пару функций, не работает.
не могли бы вы предоставить входные данные/пример об экспорте в формате файла html для веток 7 и 8 с использованием функции «paste0(new_directory_name,»/»,<insert-output-name>)».
Просто уточню, вы пробовали html_test <- paste0(new_directory_name,"/","dtable.html") и это не сработало?
я попытался запустить предложенный код, он не сохраняет файлы html в каталогах. Вставка кода для ветки 7 и 8 в другой комментарий/ответ на ваш раздел вопросов. Пожалуйста помогите.
Ах я вижу. Похоже, это известная проблема с функцией saveWidget(): github.com/ramnathv/htmlwidgets/issues/299
Я отредактировал ответ, чтобы использовать решение проблемы github, на которую я ссылался. Теперь это должно работать для ваших виджетов, сохраняя их в html.
большое спасибо за постоянную помощь. Очень признателен.
есть один глюк в скрипте. Когда я применяю скрипт к большому количеству файлов в каталоге. Скрипт выдает ошибку и прекращает работу с остальными файлами в каталоге. Это может быть связано с тем, что в некоторых файлах нет совпадающих генов/признаков (Module_10_1_geneLists) по сравнению с «рейтингами» наборов генов (т. е. motifRankings). Любые входные данные/функции о том, как превзойти проход/выполнение в цикле, когда присутствует один из этих типов файлов. Спасибо.
'Ошибка в .RcisTarget_calcAUC(geneSets = geneSets, ранжирование = ранжирование: в ранжирование включено менее 80% генов/признаков в геномных наборах. Проверьте идентификаторы в 'рейтингах' (столбцах) и 'geneSets ' соответствовать.'
Похоже, вы просто хотите, чтобы цикл for продолжался для последующих итераций после ошибки. Этот ответ должен помочь: stackoverflow.com/questions/14748557/skipping-error-in-for-loop
7. Конечным результатом RcisTarget является data.table и экспорт в html.
motifEnrichmentTable_wGenes_v1_wLogo <- addLogo(motifEnrichmentTable_wGenes_v1)
resultsSubset <- motifEnrichmentTable_wGenes_v1_wLogo[1:147,]
Type_v2 <- "Motifs_Table"
# Extract the file name without the extension, so the directory with the results
# will correspond to this name:
new_directory_name <- gsub(x = file_names[i],pattern = "(.*)\\.txt","\\1")
#Create the new directory:
dir.create(new_directory_name)
library(DT)
library(webshot)
library(htmltools)
library(xml2)
## export the data table to html file format###
dtable <- datatable(resultsSubset[,-c("enrichedGenes", "TF_lowConf"), with=FALSE],
escape = FALSE, # To show the logo
filter = "top", options=list(pageLength=1000))
html_test <- paste0(new_directory_name,"/","dtable.html")
##To save files in the pdf format###
#saveWidget(dtable, html_test)
#webshot(html_test, paste0(new_directory_name,"/", "motif.pdf"))
8. Построение сети и экспорт в формат html
# Extract the file name without the extension, so the directory with the results
# will correspond to this name:
new_directory_name <- gsub(x = file_names[i],pattern = "(.*)\\.txt","\\1")
#Create the new directory:
dir.create(new_directory_name)
signifMotifNames <- motifEnrichmentTable$motif[1:3]
incidenceMatrix <- getSignificantGenes(Module_10_1_geneLists,
motifRankings,
signifRankingNames=signifMotifNames,
plotCurve=TRUE, maxRank=5000,
genesFormat = "incidMatrix",
method = "aprox")$incidMatrix
library(reshape2)
edges <- melt(incidenceMatrix)
edges <- edges[which(edges[,3]==1),1:2]
colnames(edges) <- c("from","to")
library(visNetwork)
motifs <- unique(as.character(edges[,1]))
genes <- unique(as.character(edges[,2]))
nodes <- data.frame(id=c(motifs, genes),
label=c(motifs, genes),
title=c(motifs, genes), # tooltip
shape=c(rep("diamond", length(motifs)), rep("elypse", length(genes))),
color=c(rep("purple", length(motifs)), rep("skyblue", length(genes))))
Network <- visNetwork(nodes, edges) %>% visOptions(highlightNearest = TRUE,
nodesIdSelection = TRUE)
##Export the network##
#visSave(Network, file = "Network.html")
html_test_v1 <- paste0(new_directory_name,"/","Network.html")
#saveWidget(Network, html_test_v1)
#webshot(html_test_v1, paste0(new_directory_name,"/", "Network.pdf"))
Просто чтобы было ясно, вы хотите перебирать файлы? Таким образом, код, который вам нужен, будет считываться в другом файле во второй строке
Data_file <- read.csv(...)для каждой итерации цикла for?