У меня есть шесть файлов Excel, все с одинаковым форматом и одинаковым количеством переменных (но с разными наблюдениями). У меня есть фрагмент кода, который мне нужно выполнить для всех и экспортировать результаты (значения p из статистического теста), но мне интересно, как я могу запустить код для всех шести файлов и экспортировать шесть уникальных файлов.
Код отлично работает, но мне приходится загружать каждый файл отдельно и каждый раз экспортировать его под разными именами.
data <- MorePercent & MoreCount & LessPercent & LessCount
#Data
Type Neutrophils Monocytes NKC .....
------------------------------------------
IN 546 2663 545
IN 0797 7979 008
OUT 0899 3899 345
OUT 6868 44533 689
HC 9898 43443 563
#Kruskal and export
PV <- as.data.frame(apply(data[-1], 2,
function(x) kruskal.test(x = x, g = data$Type)$p.value))
#rename col
colnames(PV) <- "PVal"
#export
write.xlsx(PV, "C:/Users/sxa074/Desktop/P01/Science Trans Med Follow Up/test2.xlsx")
#Post Hoc and export
PV1 <- as.data.frame(apply(data[-1], 2,
function(x) pairwise.wilcox.test(x = x, g = data$Type, p.adjust.method = "BH")$p.value))
#Omit NA row
PV1 <- na.omit(PV1)
#Rename Rows
row.names(PV1) <- c("HC vs In", "HC vs OUT", "IN vs OUT")
#Export
write.xlsx(PV1, "C:/Users/sxa074/Desktop/P01/Science Trans Med Follow Up/test2A.xlsx")
В настоящее время я экспортирую два файла Excel для каждого исходного файла (значения Kruskal P и значения Wilcox P), но мне приходится каждый раз заходить вручную и корректировать имена. Я хочу, чтобы код запускал их все и экспортировал уникальные файлы.
Спасибо заранее.
Здесь уместна петля for
. Это решение предполагает, что ваши данные находятся в одном каталоге, а результаты должны быть помещены в другой. Однако они могут находиться в одном каталоге. В этом решении p-значения из теста Крускала-Уоллиса а также p-значения из попарного теста Уилкоксона объединяются в одну таблицу, которая будет сохранена в виде файла Excel.
Если вы заинтересованы в консолидации результатов, вы можете использовать опцию sheetName
в write.xlsx()
, чтобы создать один файл Excel с несколькими листами.
В этом примере вам (конечно) нужно заменить заполнитель «<...>
» соответствующими параметрами для вашей ситуации.
# Define directories of data and results
dataPath <- <directory with flow data>
resultsPath <- <directory for results>
# Vector of file names; a pattern for old and new Excel files is "xlsx?$"
ff <- list.files(path = dataPath, pattern = "<pattern>", full = TRUE)
# Good old fashioned for loop
for (f in ff) {
data <- read.xslx(f, <other parameters>) # edit as required
pv1 <- apply(data[-1], 2, function(x) kruskal.test(x, data$Type)$p.value)
pv1 <- t(pv1) # transpose 3 x 1 result to 1 x 3
pv2 <- apply(data[-1], 2, function(x) pairwise.wilcox.test(x, data$Type,
p.adjust.method = "BH")$p.value)
pv2 <- na.omit(pv2)
ans <- rbind(pv1, pv2)
rownames(ans) <- c("Pval", "HC vs In", "HC vs OUT", "IN vs OUT")
fout <- file.path(resultsPath, paste("RESULTS", basename(f), sep = "_"))
write.xlsx(ans, fout, rowNames = TRUE)
}
Относительно переменных-заполнителей «<...>
»:
Для каталогов это просто расположение файлов. Например, если для каждого эксперимента используется один каталог, то и данные, и результаты могут храниться в одном и том же каталоге. На компьютере с Windows это может быть что-то вроде "C:\Users\Owner\Documents\Flow Analysis\2019_0512"
. И dataPath
, и resultsPath
будут установлены на это значение. Кстати, вы можете использовать следующий код для извлечения каталога данных, содержащего выбранный вами файл. Функция file.choose()
позволяет выбрать файл через обычный диалог операционной системы.
dataPath <- dirname(file.choose())
Для функции list.files()
см. справочную функцию для list.files
(или dir
). Параметр pattern
указывает регулярное выражение, которое можно использовать для выбора только файлов данных. Например, если шесть файлов данных выглядели как «FlowFile001.xlsx», «FlowFile002.xlsx», ..., «FlowFile006.xlsx», то шаблон регулярное выражение, указывающий, что эти файлы могут быть «Flow.*xlsx$». (Посмотрите regex
, чтобы узнать о мире регулярных выражений, если это незнакомо.)
Параметры для read.xslx()
зависят от структуры ваших данных в файле Excel. Например, это может включать пропуск пустых строк с помощью skipEmptyRows = TRUE
.
Рад узнать, что это помогло. Определенно стоит изучить базовые циклы и семейство функций apply
, если вы хотите автоматизировать анализ с помощью R (или любого языка/среды программирования). Я добавил редактирование, чтобы уточнить природу заполнитель «<...>
».
Дэвид, это невероятно полезно, спасибо! Иметь значения P для обоих тестов в одной таблице на самом деле еще проще. Что касается "<...>", не могли бы вы уточнить, что вы подразумеваете под параметрами? Будет ли это местоположение моих файлов? Прошу прощения, я не очень хорошо разбираюсь в циклах вообще!